上一节的内容都是从上到下执行的顺序语句,本节介绍shell中的分支语句,满足一些逻辑判断的使用。shell中分支语句主要是两种:一种是if语句,另一种是case语句。
1. if语句
1.1 简单的if语句
if后面的指令,首先会被执行,然后根据指令的返回状态码进入对应的分支。如果状态码为0,也就是指令执行成功,就进去then的部分;非0则进入其他分支。举例,建立脚本如下:
#!/bin/bash
if date;then
echo "date return $?"
fi
运行结果如下:
2019年 12月 07日 星期六 23:00:25 CST
date return 0
再举一个返回码非零的例子,建立脚本test10.sh如下:
#/bin/bash
if abcdefg;then
echo "success->abcdefg return $?"
else
echo "failed->abcdefg return $?"
fi
运行结果如下:
./test10.sh: 行 2: abcdefg: 未找到命令
failed->abcdefg return 127
1.2 条件判断
上面的返回值是通过指令的状态码来选择分支,还有一种用的比较多的就是条件判断。
1.2.1 数学相关的判断
数学比较指的是对两个数字的大小进行判断,其中-eq判断是否相等(equal),-ge判断大于等于(getter equal),-gt判断大于(getter),-le判断小于等于(lower equal),-lt判断小于(lower),-ne判断不等于(not equal)。
举个例子:
#/bin/bash
var1=34
var2=35
if [ $var1 -eq $var2 ];then
echo "$var1 and $var2 is equal"
else
echo "not equal"
fi
输出结果:
not equal
注意:这些比较只能用在整数里面。
注意:有时候我们想在if判断中使用大于小于号这种符号进行判断,那么可以使用双小括号的形式。举例如下:
#/bin/bash
var=3
if (( $var ** 2 >= 9 ));then
(( var2 = $var ** 2 ))
echo "var2 = $var2"
fi
运行结果:
var2 = 9
1.2.2 字符串相关的判断
字符串比较包括
(1) 字符串是否相等 : str1 = str2
(2) 字符串是否不等: str1 != str2
(3) 字符串大小,也就是字典顺序,越靠后越大:str1 > str2或者str1 < str2,注意:这里的符号要转义,否则变成了重定向了。
(4) 字符串长度是否为0 :-z str
(5) 字符串长度是否非0: -n str
a)比较相等的举例:
#/bin/bash
name=wulinwaizhuan
name2=$name
if [ $name = $name2 ];then
echo "$name and $name2 is equal"
else
echo "$name and $name2 is not equal"
fi
运行结果:
wulinwaizhuan and wulinwaizhuan is equal
b)比较字典序
#/bin/bash
var1="wulinwaizhuan"
var2="Wulinwaizhuan"
if [ $var1 \< $var2 ];then
echo "$var1 is less than $var2"
else
echo "$var2 is less than $var1"
fi
运行结果:
Wulinwaizhuan is less than wulinwaizhuan
这说明大写字母排在字典的后面(类似于ascii的大小)。
注意:sort 命令会把小写字母放在前面。
c)字符串是否为空
#/bin/bash
var1="wulinwaizhuan"
var2=""
if [ -n $var1 ];then
echo "$var1 is not empty"
fi
if [ -z $var2 ];then
echo 'var is empty'
fi
运行结果:
wulinwaizhuan is not empty
var is empty
注意:有时候想在字符串比较的时候使用正则表达式,可以使用双方括号,举例如下:
#/bin/bash
name=wulin345
if [[ $name == wulin[1-5]* ]];then
echo "OK"
fi
运行如下:
OK
1.2.3 文件相关的判断
(1) -f file 判断file是否存在并且是一个文件
(2) -d file 判断file是否存在并且是一个文件夹
(3) -e file 判断file是否存在
(4)-s file判断file是否存在并且非空
(5) -r file 判断file是否存在并且可读
(6) -w file 判断file是否存在并且可写
(7) -x file判断是否存在并且可执行
(8) -O file判断file是否存在并且属于当前用户所有
(9) -G file 判断file是否存在并且默认组与当前用户相同
(10) file1 -nt file2 判断file1是否比file2新
(11)file2 -ot file2 判断file1是否比file2旧
举例如下:
1)判断文件tmp.txt是否存在
#/bin/bash
file=tmp.txt
if [ -e $file ];then
echo "file $file is exist"
fi
运行如下:
file tmp.txt is exist8.
2 )判断目录/bin是否存在
#/bin/bash
directory=/bin
if [ -d $directory ];then
echo "$directory exists"
else
echo "$directory not exists"
fi
运行结果如下:
/bin exists
1.2.4 多个条件组合
条件判断可以用两种组合,一个是逻辑与(&&),另一个是逻辑或(||)
举例如下:
#/bin/bash
if [ -d /home ] && [ -e /bin ];then
echo "home and bin directory exist"
fi
if [ 3 -gt 2 ] || [ 3 -lt 2 ];then
echo "OK"
fi
运行如下:
home and bin directory exist
OK
2. case语句
if语句经常用在分支不是很多的场景下,当分支较多时可以考虑使用case语句。
#/bin/bash
fruit=apple
case $fruit in
apple|banaba)
echo "fruit is $fruit"
echo "case 1";;
waterwalemon)
echo "case 2";;
orange)
echo "case 3";;
*)
echo "case default"
esac
运行如下:
fruit is apple
case 1deng
注意:可以用竖线把多个选项并在一起;
可以用*号匹配最后的其余情况;
每个case的结尾要用两个;;表示结束,当然最后一个可写可不写。
3 总结与展望
3.1总结
(1)如何写简单的if语句;
(2)判断条件中怎么写数学相关的比较,比如大于小于等;
(3) 判断条件中怎么写字符串相关的比较,比如两个字符串是否相等,字符串是否为空等;
(4) 文件相关的判断,比如文件是否存在
(5) 多个条件组合,比如条件与和条件或
(6)case语句的注意点
3.2 展望
下次更新将学习使用shell中的循环语句怎么写。