持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第23天,点击查看活动详情
能学shell脚本的基本上都学过一门以上的编程语言,条件判断基本上也是大同小异了。这里的关键字区别就是 else if直接用elif
if [ expression ]; then
# if条件后的代码
elif [ expression ]; then
# elif条件后的代码
else
# else条件后的代码
fi
但是这里要注意一些点,那就是空格,我用ABCD标明了,其中A、B、C三个空格都是不可以省略的,而D空格可省略,其实无论哪一门语言,使用空格都是一门艺术,建议初学者严格按照规范来。
[]和[[]]的区别
- [ 实质上命令test的另一种形式,[[ 是一种更符合你期望的test命令
- [ 符合POSIX标准,[[不符合POSIX标准
- 现代Linux发行版自带的shell环境普遍支持 [[,推荐优先使用(除非需要考虑兼容古老shell)
也就是说,上面的条件判断最好写成这样:
if [[ expression ]]; then
# if条件后的代码
elif [[ expression ]]; then
# elif条件后的代码
else
# else条件后的代码
fi
中括号[]
1、中括号可以定义测试条件
2、中括号中的表达式前后都需要加一个空格
3、中括号内一般用于四种类型语句的判断
(1)数值比较
(2)字符串比较
(3)文件比较
(4)符合条件比较
双中括号[[]]
1、双中括号提供了字符串比较的高级特性(中括号高配)
2、括号中可以定义一些正则表达式来匹配字符串
3、不是所有的shell解释器都支持双中括号
4、双中括号内的表达式前后也必须有一个空格
bash支持的表达式类型
- 单个字符串(常量)或者变量
- 恒假表达式(在if条件判断必定为假)
- 空字符串
- 未定义变量名
- 逻辑运算符
- !取反:之前是正确则变错误,错误则变正确。
- -a或&&:逻辑与,“且”的意思(两边需同时成立)
- -o或||:逻辑或,“或”的意思(如果第一个条件满足,则不需要看第二个条件,直接跳过,如果第一个条件失败,则查看第二条)
- 使用逻辑运算符构成的条件表达式应使用[[]]包围
直接上脚本:
下面来一一说明:
(1)为什么没有换行?printf其实跟C语言的语法一样,需要显示使用换行符。
(2)为什么输出了01235678?我们这里其实是被自己用的编程语言所干扰了,比如上面的0、1、true、false、'空格'、'true'、'false'、'$girlFriend'等都属于字符串,而shell里面的if判断,只要为字符串即为真。
(3)而第4空字符串跟第9未定义变量则是恒假表达式,这里要注意用双引号包裹起来的才是引用变量,而第8用单引号包裹的会当成字符串,前面有说过单引号与双引号的作用与区别,这里就不在赘述了。
数值比较运算表达式:
[ a -eq b ] a和b两数相等返回为真,= equal
[ a -ne b ] a和b两数不等返回为真,<> not eaual
[ a -gt b ] a大于b返回为真,> greater then
[ a -ge b ] a大于等于b返回为真,>= greater equal
[ a -lt b ] a小于b返回为真,< less then
[ a -le b ] a小于等于b返回为真,<= less equal
就随便举个例子,只要语法格式正确,随便玩
字符串比较表达式
[ -z "STRING" ] 如果STRING的长度为零则返回为真,即空是真
[ -n "STRING" ] 如果STRING的长度非零则返回为真,即非空是真
[ "a" ] 如果字符串不为空则返回为真,与-n类似
[ "a" = "b" ] 如果两个字符串相同则返回为真
[ "a" == "b" ] 如果两个字符串相同则返回为真
[ "a" != "b" ] 如果字符串不相同则返回为真
[ "a" < "b" ] 如果 “a”字典排序在“b”前面则返回为真。
[ "a" > "b" ] 如果 “a”字典排序在“b”后面则返回为真。
注意:
(1)上面表达式中的双引号不能省略,避免字符串中包含的空格会改变表达式的语义
(2)上面的 = 与 == 其实是一样的,只不过 = 是比较古老的用法,按照现在主流编程语言的话,还是用 == 更符合
(3)注意这里的 < > 不是小于号大于号了,是排序先后相等
例子:
输出都比较简单,就不一一详解了
case用法
case "变量值" in
值1) 指令 ... ;;
值2) 指令 ... ;;
*) 指令 ... ;;
esac
注意点:
(1)指令后面必须是两个分号;;
(2)* ) 表示前面所有值都匹配不上的缺省操作
把变量修改一下: