1、if-then语句
格式如下:
if command
then
commands
fi
或者
if command; then
commands
fi
2、嵌套if
格式如下:
if command
then
commands
else
commands
if command
then
commands
fi
fi
或者
if command
then
commands
elif command
then
commands
fi
3、test命令
test命令的格式非常简单,如下
test condition
condition 是test命令要测试的一系列参数和值。当用在if-then语句中时,test命令使用方式如下:
if test condition
then
commands
fi
bash shell提供了另一种条件测试方法,无需在if-then语句中声明test命令。
if [ condition ]
then
commands
fi
方括号定义了测试条件,注意,第一个方括号和第二个方括号之前必须加上一个空格。
test命令可以判断三类条件:
数值比较
字符串比较
文件比较
3.1、数值比较
比较 | 描述 |
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是否不相等 |
3.2、字符串比较
比较 | 描述 |
str1 = str2 | 字符串是否相同 |
str1 != str2 | 字符串是否不相同 |
str1 < str2 | 字符串str1是否小于str2 |
str1 > str2 | 字符串str1是否大于str2 |
-n str1 | 检查str1是否不为空 |
-z str1 | 检查str1是否为空 |
注意:test命令 和测试表达式使用标准的数学比较符号表示字符串比较,而用文本代码来表示数值比较。如果你对数值使用了数学运算符号,shell会将它们当成字符串值,可能无法得到正确的结果。
3.3、文件比较
[ -d FILE ] 如果 FILE 存在且是一个目录则为真。
[ -e FILE ] 如果 FILE 存在则为真。
[ -f FILE ] 如果 FILE 存在且是一个普通文件则为真。
[ -r FILE ] 如果 FILE 存在且是可读的则为真。
[ -s FILE ] 如果 FILE 存在且大小不为0则为真。
[ -w FILE ] 如果 FILE 如果 FILE 存在且是可写的则为真。
[ -x FILE ] 如果 FILE 存在且是可执行的则为真。
[ -O FILE ] 如果 FILE 存在且属有效用户ID则为真。
[ -G FILE ] 如果 FILE 存在且属有效用户组则为真。
[ FILE1 -nt FILE2 ] 如果 FILE1 比 FILE2 要新,或者FILE1 存在且 FILE2 不存在则为真。
[ FILE1 -ot FILE2 ] 如果 FILE1 比 FILE2 要老, 或者 FILE2 存在且 FILE1 不存在则为真。
[ FILE1 -ef FILE2 ] 如果 FILE1 和 FILE2 指向相同的设备和节点号则为真。
4、if-then的高级特性
bash shell提供了两项可在if-then语句中使用的高级特性:
用于数学表达式的双括号;
用于高级字符串处理功能的双方括号。
4.1、使用双括号
格式: (( expression ))
除了使用标准的数学运算符,双括号命令中用到的其它运算符号如下:
var++ 后增
var-- 后减
++var 先增
--var 先减
! 逻辑求反
~ 位求反
** 幂运算
<< 左位移
>> 右位移
& 按位与
| 按位或
&& 逻辑与
|| 逻辑或
可以在if语句中用双括号命令,也可以在脚本中的普通命令里使用来赋值。
案例1:
cat test.sh
#!/bin/bash
val=10
if (( $val ** 2 >90 ))
then
((val2=$val**2))
echo "the square of $val is $val2"
fi
输出结果如下:
[root@localhost]# ./test.sh
the square of 10 is 100
注意:不需要将双括号中表达式的大于号转义,这是双括号命令提供的另一个高级特性。
4.2、使用双方括号
格式 : [[ expression ]]
双方括号里的expression使用了test命令中采用的标准字符串比较。但它提供了test命令为提供的一个特性-模式匹配。
在模式匹配中,可以定义一个正则表达式来匹配字符串值。
案例2:
cat test2.sh
#!/bin/bash
if [[ $USER == r* ]]
then
echo "Hello $USER"
else
echo "sorry,i do not know you"
fi
输出结果为:
[root@localhost]# ./test2.sh
Hello root
在上面的脚本中,使用了双等号,双等号将右边的字符串(r*)视为一个模式,并应用模式匹配规则。
5、case命令
case variable in
pattern1|pattern2) commands1;;
pattern3) commands2;;
*) default commands;;
esac