Shell脚本编程基础第七天之--条件判断

173 阅读4分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第23天,点击查看活动详情

能学shell脚本的基本上都学过一门以上的编程语言,条件判断基本上也是大同小异了。这里的关键字区别就是 else if直接用elif

if [ expression ]; then
# if条件后的代码
elif [ expression ]; then
# elif条件后的代码
else
# else条件后的代码
fi

但是这里要注意一些点,那就是空格,我用ABCD标明了,其中A、B、C三个空格都是不可以省略的,而D空格可省略,其实无论哪一门语言,使用空格都是一门艺术,建议初学者严格按照规范来。

image.png

[]和[[]]的区别

  • [ 实质上命令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或||:逻辑或,“或”的意思(如果第一个条件满足,则不需要看第二个条件,直接跳过,如果第一个条件失败,则查看第二条)
  • 使用逻辑运算符构成的条件表达式应使用[[]]包围

直接上脚本:

image.png

image.png

下面来一一说明:
(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

就随便举个例子,只要语法格式正确,随便玩

image.png

image.png

字符串比较表达式

[ -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)注意这里的 < > 不是小于号大于号了,是排序先后相等

例子:

image.png

输出都比较简单,就不一一详解了

image.png

case用法

case "变量值" in
值1) 指令 ... ;;
值2) 指令 ... ;;
*)   指令 ... ;;
esac

注意点:
(1)指令后面必须是两个分号;;
(2)* ) 表示前面所有值都匹配不上的缺省操作

image.png

image.png

把变量修改一下:

image.png

image.png