目录
完整笔记请前往此处获取:https://download.csdn.net/download/qq_55908180/88366003
1、使用if-then语句
if-then语句是最基本的结构化命令,格式如下:
If command
then
commands
fi
shell的if语句会执行if之后的命令,如果该命令的退出状态码是0,则就是继续执行then后面的命令;如果if后的命令的退出状态码是其他值,则不会执行then后面的命令,但是shell会继续执行脚本中的下一个命令。Fi语句表示if-then语句到此结束。如:
例1:if后的命令可以正常执行
例2:if后面的命令无法正常执行
Then后面可以跟大于一条命令,只要if语句后的命令的退出状态码是0,则then后面的命令都可以执行;如果if语句后面的命令的退出状态码非0,则then后面的命令全部跳过。如:
2、使用if-then-else语句
在if-then语句中,不管命令成功与否,你都只有一种选择。而if-then-else语句就在语句中提供了另一组命令:
If command
then
commands
else
commonds
fi
在if后的命令的退出状态码为非0时,跳过then后面的命令,直接执行else后的命令。如:
3、嵌套if
嵌套的if-then语句位于主if-then-else语句的else代码块中。格式如下:
If command1 then commands else commands if command2 then commands fi fi
还有另外一种更易于阅读的格式:
If command1
then
commands
elif command2
then
commands
fi
4、test命令
test命令提供了if-then语句中测试不同的途径,如果test命令中列出的条件成立,test命令就会退出并返回退出状态码0。命令格式如下:test condition
Condition是test命令要测试的一系列参数和值。当用在if-then 语句中时,如下:
if test condition then commands fi 如果test不写condition部分,他会以非0的退出状态码退出,并执行else语句块。如:
Bash shell 提供了另一种条件测试方法,无需在if-then语句中声明test命令。格式如:
If [ condiftion ] then commands fi
方括号定义测试条件,注意:这种方法必须在测试条件前后都加上一个空格才行,否则会报错。
Test命令可以判断三类条件:1、数值比较;2、字符串比较;3、文件比较。
4.1、数值比较
Test命令最常见的情形是对两个数值的比较
比较 | 描述 |
n1 -eq n2 | 检查n1 是否与n2相等 |
n1 -ge n2 | 检查n1 是否大于或等于n2 |
n1 -gt n2 | 检查n1 是否大于n2 |
n1 -le n2 | 检查n1 是否小于或等于n2 |
n1 -lt n2 | 检查n1 是否小于n2 |
n1 -ne n2 | 检查n1 是否不等于n2 |
帮助记忆:
e、eq==equal (等于)
g、gt==greater (更大)
l、lt==less (更小)
n==no (不)
注意,bash shell 只能处理整数,在test命令中不能使用浮点值。
4.2、字符串比较
字符串比较测试
比较 | 描述 |
str1 =str2 | 检查str1是否与str2相同 |
str1 !=str2 | 检查str1是否与str2不同 |
str1 <str2 | 检查str1是否比str2小 |
str1 >str2 | 检查str1是否比str2大 |
-n str1 | 检查str1的长度是否为非0 |
-z str1 | 检查str1的长度是否为0 |
注意,在比较字符串是否相等时,比较测试会把所有的标点和大小写情况都考虑在内。
要测试一个字符串是否比另一个字符串大要注意两个问题:
- 大于号和小于号必须转义,否则可能会被当作重定向符使用;
- 由于比较测试中使用的是标准的ASCⅡ顺序,会根据每个字符的ASCⅡ值来决定排序结果。
如:
4.3、字符串大小
-n 和-z 可以检查一个变量是否含有数据
4.4、文件比较
文件比较是在bash shell中最强大、使用最多的比较形式。
比较 | 描述 |
-d file | 检查file是否存在并是一个目录 |
-e file | 检查file是否存在 |
-f file | 检查file是否存在并是一个文件 |
-r file | 检查file是否存在并可读 |
-s file | 检查file是否存在并非空 |
-w file | 检查file是否存在并可写 |
-x file | 检查file是否存在并可执行 |
-o file | 检查file是否存在并属于当前用户所有 |
-G file | 检查file是否存在并且默认组与当前用户相同 |
file1 -nt file2 | 检查file是否比file2新 |
file1 -ot file2 | 检查file是否比file2旧 |
5、复合条件测试
if-then语句允许使用布尔逻辑来组合测试。有两种布尔运算符可用:
- [ condition1 ] &&[ condition2 ]
- [ condition1 ] ||[ condition2 ]
第一种布尔运算使用AND布尔运算符组合两个条件。只有两个条件全都满足的时候才能使then部分的命令执行。
第二种布尔运算使用了或运算符来组合两个条件,只要有至少一个条件为真,就可以继续执行then部分的命令。如下:
6、if-then的高级特性
在bash shell中提供了两项可以在if-then语句中使用的高级特性:
1、用于数学表达式的双括号;
2、用于高级字符串处理功能的刷个方括号。
6.1、使用双括号
双括号命令允许在比较过程中使用高级数学表达式。test命令只能在比较中使用简单的算术操作,双括号命令提供了更多的数学符号。双括号的命令格式:
(( expression )) 其中expression可以是任意的数学赋值或比较表达式。
符号 | 描述 |
val++ | 后增 |
vla-- | 后减 |
++val | 先增 |
--val | 先减 |
! | 逻辑求反 |
~ | 位求反 |
** | 幂运算 |
<< | 左位移 |
>> | 右位移 |
& | 位布尔和 |
| | 位布尔或 |
&& | 逻辑和 |
|| | 逻辑或 |
可以在if语句中用双括号命令,也可以在脚本中的普通命令里使用。如:
6.2、使用双方括号
双方括号命令提供了针对字符串比较的高级特性。命令格式:[[ expression ]]。它提供了test命令未提供的另一个特性——模式匹配 如:
7、case命令
case命令会采用列表格式来检查单个变量的多个值。如:
case variable in
pattern1 | pattern2)
commands1;;
pattern3)
commands2;;
*)
default commands;;
esac