定义
built-in命令,外部命令,函数在退出时,都有退出状态,即返回值,范围:0-255。
返回值0表示成功
返回值非0表示失败,其中127为command not found,126为文件存在但无法执行
访问
返回值不会打向标准输出。通过$?变量访问返回值
主动退出并返回一个值
- $exit N
if判断
if结构使用返回值(退出状态)作为判断
常见if结构:
-
if judgement
-
then
-
your_clauses_goes_here
-
else
-
your_another_clauses_goes_here
- fi
-
等价于
- if judgement; then
- ...
-
if some_command ; then ....
-
if test term ; then ...
-
if [ term ] ; then ...
- if [[ term ]] ;
短路运算符&&和||
&&,||
用返回值判断真伪,当只要判断出表达式的真伪,即停止表达式的运行。
sub1 && sub2, sub1成功了才会执行sub2,不然跳过sub2,是‘逻辑与’的判断;
sub1 || sub2, sub1失败了才会执行sub2,不然跳过sub2,是‘逻辑或’的判断;
所以:
-
some_command && {
-
code of blocks
-
}
-
与
-
some_command || {
-
code of blocks
- }
原语句如下:
-
if sub1
-
then
-
sub2
-
else
-
sub3
- fi
- sub1 && sub2 || sub3 #错误,当sub1成功时,执行sub2,当sub2在执行过程中异常,返回码不为0,则触发sub3的动作,不符合预期
- sub1 || sub3 && sub2 #错误,当sub1失败时,触发sub3逻辑,如果sub3正常退出,返回码为0,则继续触发sub2动作,不符合预期
test命令
test通过断言判断,产生真伪返回值。一般判断错误为1,test语法错误为2.
test等价形式为中括号,'[ ]';
bash 的内部命令,[和test是等同的。test结构中的左中括号是调用test的命令标识,右中括号是关闭条件判断的。这个命令把它的参数作为比较表达式或者作为文件测试,并且根据比较的结果来返回一个退出状态码。
如,
-
test "$a" = "$b" 返回0,1 #判断a,b是否为相同的字串
-
#等价于
- [ "$a" && "$b" ] #这里[ ]内部的空格不能少
关于字串
[ "$str" ] #the length of STRING is nonzero
[ -n "$str" ] #等价
[ -z "$str" ] #相反地,the length of STRING is zero
[ "$str1" = "$str2" ] #字串相等,等价于'=='
[ "$str1" != "$str2" ] #字串不等
关于文件
[ -d "$file" ] #$file是否为目录
[ -f "$file" ] #$file是否为普通文件
[ -h "$file" ] #$file是一个符号链接,-L是等价参数
[ -r "$file" ] #$file是只读的
[ -s "$file" ] #$file非空
关于数字
[ $num1 -eq $num2 ] #相等
[ $num1 -lt $num2 ] #小于
lt:less than
gt:greater than
le:less and equal
ge,greater and equal
关于联合判断
[ $a == $b && $b == $c ] #错误
[ $a == $b ] && [ $b == $c ] #正确
[ $a == $b -a $b == $c ] #正确,or是-o
关于否定
[ ! -f $file ] #前置file
warnings:
1. 强制:使用test或'[ ]'时,参数必须加“$str”,不然[ -n $str ]将失效,当$str里有空格时,判断报错;
2. 建议:字符串判断前加X,如 [ "X$a" == "X$b" ];
3. 建议:有些shell不能用浮点数字判断,如 [ 1.23 == 1.23 ]
-------------------------------------
test的扩展形式:双中括号
test即[],是shell内置命令,test的扩张'[[ ]]'是shell的关键字。
相同在于:
判断测试的参数相同,
产生返回值,用于逻辑判断和控制
不同在于:
[[ ]] 不处理单词展开与文件名扩展,即参数不用加""(第三点需要加"")
[[ ]] 可以支持[[ $a == $b && $b == $c ]], 而test不能
[[ ]] 支持正则,如[[ abc == ab? ]]返回0,[ abc == ab? ]返回1
因此,双中括号成为了替代test的方案。
examples1:
-
if [ -x ifx.sh -o -r if.sh ]; then echo yes; fi #写法对
-
if [ -x ifx.sh ] || [ -r if.sh ]; then echo yes; fi #等价
-
if [ -x ifx.sh || -r if.sh ]; then echo yes; fi #错误!
-
if [[ -x ifx.sh || -r if.sh ]]; then echo yes; fi #双中括号,正确
- if [ -x ifx.sh -o cat if.sh ]]; then echo yes; fi #大谬!
- if [ -x ifx.sh ] || cat if.sh ; then echo yes; fi #正确
-
[ "Linux x86_64" == $( uname -m -s ) ] && echo yes #没加""
-
-bash: [: too many arguments
-
[ "Linux x86_64" == "$( uname -m -s )" ] && echo yes #test要加上
-
yes
-
[[ "Linux x86_64" == $( uname -m -s ) ]] && echo yes #双中括号不用加
- yes
-
[[ "abc" == "ab?" ]] #字串匹配
-
[[ "abc" == ab? ]] #正则匹配,危险
- [[ "abc" =~ ab? ]] #正确的正则匹配,所以在这一点上,为了保险起见,还是[[ "$str1" == "$str2" ]]好,避免正则而非字串形式被匹配到
参考
http://blog.sina.com.cn/s/blog_7e9efc570101ak1y.html