文章目录
结构化命令(structured command):命令会根据条件使脚本跳过某些命令。
1.使用if-then语句
if-then语句有如下格式:
if command
then
commands
fi
notice:
- bash shell的if语句会运行if后面的那个命令,then是否执行依据if后面的命令执行的退出状态码。(和C/java等语言if语句后面判断依据不同)
- then 部分可以跟多条命令语句,执行依据依然是if后面的命令执行的退出状态码。
- if-then语句只能测试命令退出状态码的条件(后续的test命令可以测试命令状态码之外的条件)。
eg:
if ls
then
echo "ls run ok."
echo "ls run ok1."
fi
2.使用if-then-else语句
Q:if-then-else语句的作用?
A:在if-then语句中,不管命令是否成功执行,你都只有一种选择。如果命令返回一个非零退
出状态码,bash shell会继续执行脚本中的下一条命令。
if-then-else语句格式如下:
if command
then
commands
else
commands
fi
eg:
if lsa
then
echo "lsa run ok."
else
echo "lsa run error." -> 这里
fi
3.嵌套if (elif)
Q:嵌套if的使用场景?
A:需要检查脚本代码中的多种条件。
嵌套if的格式如下(常见多种,具实选用):
if command1
then
commands
else
commands
if command2
then
commands
fi
fi
if command1
then
commands
elif command2
then
commands
fi
if command1
then
commands
elif command2
then
commands
else
fi
举例一种:
if lsa
then
echo "lsa error"
elif pwda
then
echo "pwda error"
else
echo "all error,over." -> 这里
fi
notcie:记住,在elif语句中,紧跟其后的else语句属于elif代码块。它们并不属于之前的if-then代码块。
4.test命令–test condition
test命令格式如下:
test condition
condition是test命令要测试的一系列参数和值。
notice:
bash shell提供了另一种条件测试方法,无需在if-then语句中声明test命令。
其格式如下(即[ condition ] == test condition
):
if [ condition ]
then
commands
fi
eg:
isfull="Full"
if test $isfull #此处可换为 if [ $isfull ]
then
echo "isfull is Full." -> 这里
else
echo "isfull is not Full."
fi
isfull=""
if test $isfull #此处可换为 if [ $isfull ]
then
echo "isfull is Full."
else
echo "isfull is not Full." -> 这里
fi
test命令可以判断三类条件:1:数值比较;2:字符串比较;3:文本比较。 其中有些特别的点需要小心谨慎的。
4.1 数值比较
数值条件测试可以用在数字和变量上。
eg:
var1=4
var2=6
if [ $var1 -eq $var2 ]
then
echo "var1==var2."
else
echo "var1!=var2." ->这里
fi
notice:bash shell只能处理整数,也就是不能在test命令中使用浮点值。
4.2 字符串比较
notice:
- 在比较字符串的相等性时,比较测试会将所有的标点和大小写情况都考虑在内。
- 大于号和小于号必须转义,否则shell会把它们当作重定向符号,把字符串值当作文件名。
eg:if [ $val1 \> $val2 ]
- 大于和小于顺序和sort命令所采用的不同。当你将同样的字符串放进文件中并用sort命令排序时,小写字母会先出现。这是由各个命令使用的排序技术不同造成的。比较测试中使用的是标准的ASCII顺序,根据每个字符的ASCII数值来决定排序结果。sort命令使用的是系统的本地化语言设置中定义的排序顺序。
- test命令和测试表达式使用标准的数学比较符号来表示字符串比较,而用文本代码来表示数值比较。
eg:
a=aa
b=bb
if [ $a > $b ]
then
echo " aa > bb" -> 这里
else
echo " aa < bb"
fi
if [ $a /> $b ]
then
echo " aa > bb"
else
echo " aa < bb" -> 这里
fi
-n和-z可以检查一个变量是否含有数据。即是否为空。
这里书中没有明显的体现出来,笔者这里将-n和-z作下对比:
参数 | 描述 |
---|---|
n | 不为空则 if 退出状态码为0 |
z | 为空则 if 退出状态码为0 |
notice:空的和未初始化的变量会对shell脚本测试造成灾难性的影响。如果不是很确定一个变量的内容,最好在将其用于数值或字符串比较之前先通过-n或-z来测试一下变量是否含有值。
eg:
v1="have" #v1 实际不为空
if [ -n $v1 ]
then
echo "v1 is not null." #-> 这里
else
echo "v1 is null."
fi
if [ -z $v1 ]
then
echo "v1 is null."
else
echo "v1 is not null." #-> 这里
fi
4.3 文本比较
test命令的文本比较允许测试Linux文件系统上文件和目录的状态。
具体细节可参考该书12.4.3章节,分别对每个参数都做了详细的说明演示。
5.复合条件测试–&& ||
if-then语句允许使用布尔逻辑来组合测试。有两种布尔运算符可用,其格式如下:
[ condition1 ] && [ condition2 ]
[ condition1 ] || [ condition2 ]
eg:
var1=aa
var2=bb
var3=cc
if [ $var3 \> $var1 ] && [ $var1 \< $var2 ]
then
echo " cc > aa && aa << bb" #这里
else
echo " && is not ok"
fi
~
6.if-then的高级特性–双括号和双方括号
6.1 用于数学表达式的双括号
双括号命令允许在比较过程中使用**高级数学表达式。**而test命令只能在比较中使用简单的算术操作。
其命令格式如下:
(( expression ))
expression 可以是任意的数学赋值或比较表达式。除了test命令使用的标准数学运算符,还有如下:
ps:双括号命令提供的另一个高级特性:不需要将双括号中表达式里的大于号转义。
eg:
var1=aa
var2=bb
var3=cc
if ( ! ([ $var3 \> $var1 ] && [ $var1 \< $var2 ]) )
then
echo " ! is not ok"
else
echo " ! is ok" # 这里
fi
6.2 用于高级字符串处理功能的双方括号
双方括号命令提供了针对字符串比较的高级特性。其命令格式如下:
[[ expression ]]
双括号命令里的expression除了使用了test命令中的标准字符串比较外,还提供了另一个特性:模式匹配(pattern matching)。
ps:双方括号在bash shell中表现良好。但不是所有的shell都支持双方括号。
eg:
if [[ $USER == h* ]] #这里不比某些语言,不能写成 if [[ h* == $USER]] 这样
then
echo "Hello $USER."
else
echo "I do not Know you." #这里
fi
7.case命令–避开大量的if-then-else语句
Q:什么时候需要使用case命令?
A:在有大量的if-then-else语句的情况下,可以考虑使用case命令。
case命令会采用列表格式来检查单个变量的多个值。
case命令格式如下:
case variable in
pattern1 | pattern2) command1s;;
pattern3) commands2;;
*) default commands;;
esac
eg:
case $USER in
root | nobody) echo "Hello, $USER root?";;
hogoadr) echo "Hello, $USER";; #这里
*) echo "Who are you?";;
esac
申明:文中没特殊注明,图皆来自Linux命令行与shell脚本编程大全<第三版>。