Shell 分支语句
首先我们需要先看下,什么是 true 和 false
true 和 false
shell 中 ture 和 false 都是一个可执行程序,ture 是 0,false 是非 0,这和其他程序语言不一致。但带来一个好处是,我们可以返回 1 ~ 255 个不同的错误码表示不同的错误。
shell 中 ture 也可以用:来表示,优点是使用:不会调用一个二进制程序,效率更高,这种用法常用在 while 中。
whereis true
true; echo $?
whereis false
false; echo $?
# 这种用法常用在while中
while :; do
echo $?
break
done
复制代码
示例及输出
zyh@DESKTOP-70600416:~$ whereis true
true: /usr/bin/true /usr/share/man/man1/true.1.gz
zyh@DESKTOP-70600416:~$ true; echo $?
0
zyh@DESKTOP-70600416:~$ whereis false
false: /usr/bin/false /usr/share/man/man1/false.1.gz
zyh@DESKTOP-70600416:~$ false; echo $?
1
zyh@DESKTOP-70600416:~$ while :; do echo $?; break ;done
0
复制代码
if 语句
if 在命令返回 true 时,执行对应分支下的命令。
# 用法1
if test -d /;then
echo "dir"
fi
# 用法2
if test -f /;then
echo "file"
elif test -d /;then
echo "dir"
fi
# 用法3
if test -f /;then
echo "file"
elif test ! -d /;then
echo "not dir"
else
echo "default"
fi
复制代码
示例及输出
zyh@DESKTOP-70600416:~$ if test -d /;then echo "dir"; fi
dir
zyh@DESKTOP-70600416:~$ if test -f /;then echo "file"; elif test -d /;then echo "dir"; fi
dir
zyh@DESKTOP-70600416:~$ if test -f /;then echo "file"; elif test ! -d /;then echo "not dir"; else echo "default"; fi
default
复制代码
test 命令
test 和 ([]) 在用途上是一样的,用于判断一个 表达式 返回的结果,推荐使用 test,test 支持的 表达式 可通过查询 man 手册看到。
省略的表达式默认为 false。否则,计算表达式结果并设置退出状态。
常用表达式
注意事项
注意使用 test 比较字符串变量的时候,要使用双引号,避免变量为空。实际上,多数情况下使用字符串变量,都应该加双引号,这是一个好习惯。
zyh@DESKTOP-70600416:~$ data=
zyh@DESKTOP-70600416:~$ test "" != $data
bash: test: : unary operator expected
# 正确实例
test "" != "${data}"
复制代码
test 中的 and 可以使用 && 或 -a ,or 可以使用 || 或 -o,但推荐使用 && 和 ||。
case 语句
case 可以用于匹配一个变量是否满足一个 正则表达式,并执行对应的分支,类似 switch。
同时,由于它带来的匹配特性,case 也是一个用于判断字符串前缀后缀的一个方式。
case 支持的 pattern 举例
示例 1 (判断字符串前缀)
#!/bin/bash
# 从上往下执行,一旦匹配则执行分支并退出。这意味这不是最长匹配,也意味着,长的匹配要放前面。
var="this is a"
case "$var" in
this*)
echo "this"
;;
or\ this\ is*)
echo "this is"
;;
*)
echo "don't know"
;;
esac
复制代码
示例 2 (判断字符串后缀)
#!/bin/bash
has_suffix() {
var="$1"
case "$var" in
*a)
echo "has suffix a"
;;
*b)
echo "has suffix b"
;;
*)
echo "don't know"
;;
esac
}
has_suffix "a"
复制代码
评论