shell中的条件测试及字符串判断
1、条件测试语法在bash的各种流程控制机构中通常要进行各种测试,然后根据测试结果执行不同的操作,有时也会通过if等条件语句相结合,让我们可以方便的完成判断。
语法说明:
格式1:test 测试表达式
格式2:[ 测试表达式 ]
格式3:[[ 测试表达式 ]]
上面的格式中,格式1和格式2是等价的。格式3为扩展的test命令。
注意&#xff1a;在[[ ]]中可以使用通配符进行模式匹配&#xff0c;如&&、||、>、<等操作符可以应用于[[ ]]中&#xff0c;但不能应用于[ ]中。
例1&#xff1a;格式1示例&#xff0c;判断zhangsan.txt这个文件是否存在
[root&#64;localhost ~]# test -f zhangsan.txt && echo true||echo false
false
[root&#64;localhost ~]# touch zhangsan.txt
[root&#64;localhost ~]# test -f zhangsan.txt && echo true||echo false
true
例2&#xff1a;格式1示例&#xff0c;test命令非&#xff08;!&#xff09;的写法&#xff0c;文件存在就输出false
[root&#64;localhost ~]# test ! -f zhangsan.txt && echo true||echo false
false
例3&#xff1a;格式2示例两种判断方法&#xff0c;第一种判断文件是否存在&#xff0c;第二种判断文件是否不存在
[root&#64;localhost ~]# [ -f zhangsan.txt ] && echo true||echo false
true
[root&#64;localhost ~]# [ ! -f zhangsan.txt ] && echo true||echo false
false
例4&#xff1a;格式3示例&#xff0c;判断两个文件是否同时存在
[root&#64;localhost ~]# [[ -f zhangsan.txt && -f lisi.txt ]] && echo true||echo false
false
[root&#64;localhost ~]# touch lisi.txt
[root&#64;localhost ~]# [[ -f zhangsan.txt && -f lisi.txt ]] && echo true||echo false
true
2、shell中常用文件测试操作符
操作符 | 说明 |
-b file | 检测文件是否存在且是块设备文件&#xff0c;如果是&#xff0c;则为真 |
-c file | 检测文件是否存在且是字符设备文件&#xff0c;如果是&#xff0c;则为真 |
-d file | 检测文件是否存在且是目录&#xff0c;如果是&#xff0c;则为真 |
-f file | 检测文件是否存在且是普通文件&#xff08;既不是目录&#xff0c;也不是设备文件&#xff09;&#xff0c;如果是&#xff0c;则为真 |
-g file | 检测文件是否存在且设置了 SGID 位&#xff0c;如果是&#xff0c;则为真 |
-k file | 检测文件是否存在且设置了粘着位(Sticky Bit)&#xff0c;如果是&#xff0c;则为真 |
-p file | 检测文件是否存在且是有名管道&#xff0c;如果是&#xff0c;则为真 |
-u file | 检测文件是否存在且设置了 SUID 位&#xff0c;如果是&#xff0c;则为真 |
-r file | 检测文件是否存在且可读&#xff0c;如果是&#xff0c;则为真 |
-w file | 检测文件是否存在且可写&#xff0c;如果是&#xff0c;则为真 |
-x file | 检测文件是否存在且可执行&#xff0c;如果是&#xff0c;则为真 |
-s file | 检测文件是否存在且为空&#xff08;文件大小是否大于0&#xff09;&#xff0c;不为空返回 true。 |
-e file | 检测文件&#xff08;包括目录&#xff09;是否存在&#xff0c;如果是&#xff0c;则为真 |
f1 -nt f2 | 检测文件f1是否比文件f2新&#xff0c;如果是&#xff0c;则为真 |
f1 -ot f2 | 检测文件f1是否比文件f2旧&#xff0c;如果是&#xff0c;则为真 |
3、shell中字符串测试操作符
字符串运算符列表 | ||
运算符 | 说明 | 举例 |
&#61; | 检测两个字符串是否相等&#xff0c;相等返回 true。 | [ $a &#61; $b ] 返回 false。 |
!&#61; | 检测两个字符串是否不相等&#xff0c;不相等返回 true。 | [ $a !&#61; $b ] 返回 true。 |
-z | 检测字符串长度是否为0&#xff0c;为0返回 true。 | [ -z $a ] 返回 false。 |
-n | 检测字符串长度是否不为0&#xff0c;不为0返回 true。 | [ -n $a ] 返回 true。 |
str | 检测字符串是否为空&#xff0c;不为空返回 true。 | [ $a ] 返回 true。 |
特别注意&#xff1a;以上表格中的字符串测试操作符号务必要用双引号” ”引起来&#xff0c;如[ -n “$name” ]以免出错。
4、整数二元比较操作符
关系运算符列表 | ||
[ ]中使用的比较符 | (( ))和[[ ]]中使用的比较符 | 说明 |
-eq | &#61;&#61; | equal缩写&#xff0c;相等 |
-ne | !&#61; | not equal缩写&#xff0c;不相等 |
-gt | > | greater than缩写&#xff0c;大于 |
-lt | < | less than缩写&#xff0c;小于 |
-ge | >&#61; | greater equal缩写&#xff0c;大于等于 |
-le | <&#61; | less equal缩写&#xff0c;小于等于 |
提示&#xff1a;
&#xff08;1&#xff09;”<”小于&#xff0c;if [[“$a” <”$b”]]&#xff0c;if [ “$a” \<“$b” ]。在单中括号中大于号&#xff08;>&#xff09;和小于号&#xff08;<&#xff09;需要转义&#xff0c;因为shell也使用<号和>号进行重定向。
&#xff08;2&#xff09;”&#61;”等于号和”!&#61;”不等于号&#xff0c;if [[“$a” &#61; ”$b”]]&#xff0c;if [ “$a” &#61; “$b” ]在单中括号中等于和不等于号不需要转义。
5、逻辑操作符
布尔运算符列表 | ||
[ ]中使用的逻辑操作符 | [[ ]]中使用的逻辑操作符 | 说明 |
! | ! | 非运算 &#xff0c;相反则为真 |
-o | || | 或运算&#xff0c;两边有一个为真&#xff0c;则真 |
-a | && | 与运算&#xff0c;两边都为真&#xff0c;则真 |
6、if分支结构
单分支语法&#xff1a;
if [ 条件 ]
then
指令
fi
双分支语法&#xff1a;
if [ 条件 ]
then
指令
else
指令
fi
多分支语法&#xff1a;
if [ 条件 ]
then
指令
elif 条件
then
指令
…………………….
else
指令
fi
多判断条件if语句&#xff0c;同样的也可以把下面的&&替换为||也可以。
#!/bin/bash
#多判断条件if语句示例
d&#61;2
e&#61;3
#方法1&#xff0c;使用单中括号结合&&符号进行多条件判断
#if [ $? -eq 0 ] && [ $d -eq 2 ] && [ $e -lt 5 ];then
#方法2&#xff0c;使用单中括号结合-a选项进行多条件判断&#xff08;-a是与运算&#xff0c;相当于&&符号&#xff0c;&#xff09;
#if [ $? -eq 0 -a $d -eq 2 -a $e -lt 5 ];then
#方法3&#xff0c;使用双中括号结合&&符号进行多条件判断
#if [[ $? &#61; 0 ]] && [[ $d &#61; 2 ]] && [[ $e <5 ]];then
if [[ $? &#61; 0 && $d &#61; 2 && $e <5 ]];then
echo "true"
fi
条件表达式配合大括号的用法
[ $? -ne 0 ] || {
echo "命令没有执行成功"
exit 1
}
7、扩展&#xff1a;判断字符串是否为数字的多种方法7.1、方法1&#xff1a;sed加正则表达式
组合语法判断1&#xff1a;
[ -n “&#96;echo $num|sed ‘s/[0-9]’//g&#96;” -a -n “&#96;echo $2|sed ‘s/[0-9]//g’&#96;” ] && echo “两个参数必须为数字” && exit 1
组合语法判断2&#xff1a;
[ -n “&#96;echo $num|sed ‘s/[0-9]//g’&#96;” -a -n “&#96;echo $2|sed ‘s/[0-9]//g’&#96;” ] && {
echo “两个参数必须为数字”
exit 1
}
单个判断语法&#xff1a;
[ -n “&#96;echo $1|sed ‘s/[0-9]//g’&#96;” ] && echo “第一个参数必须为数字” && exit 1
[ -n “&#96;echo $2|sed ‘s/[0-9]//g’&#96;” ] && echo “第二个参数必须为数字” && exit 1
普通变量判断&#xff1a;
[ -n “&#96;echo $num|sed ‘s/[0-9]//g’&#96;” ] && echo “第二个参数必须为数字” && exit 1
条件表达式&#xff0c;大括号的用法&#xff1a;
[ -n “&#96;echo $num|sed ‘s/[0-9]//g’&#96;” ] && {
echo “第二个参数必须为数字”
exit 1
}
7.2、方法2&#xff1a;变量的子串替换加正则表达式
[root&#64;localhost ~]# num&#61;long123
[root&#64;localhost ~]# [ -z "&#96;echo "${num//[0-9]/}"&#96;" ] && echo 1||echo 0
0 #这个结果说明前面的结果不为0&#xff0c;即有非数字字符
[root&#64;localhost ~]# num&#61;500
[root&#64;localhost ~]# [ -z "&#96;echo "${num//[0-9]/}"&#96;" ] && echo 1||echo 0
1 #这个结果说明前面的结果去掉数字后为0&#xff0c;即没有非数字字符
7.3、方法3&#xff1a;变量的子串替换加正则表达式&#xff08;特殊判断思路&#xff09;
思路&#xff1a;如果num长度不为0&#xff0c;并且把num中的非数字部分删除&#xff0c;然后看结果是不是等于num本身&#xff0c;如果两者都成立就是数字。
-n “$num” #如果num长度不为0表达式
“$num” &#61; “${num//[^0-9]/}” #把num中的非数字部分删除&#xff0c;然后看结果是不是等于num本身&#xff0c;如果两者都成立就是数字。
完整表达式&#xff1a;
[root&#64;localhost ~]# [ -n "$num" -a "$num" &#61; "${num//[^0-9]/}" ] && echo "it is num"
it is num
7.4、方法4&#xff1a;expr计算判断
[root&#64;localhost ~]# expr $1 &#43; 0 &>/dev/null
[root&#64;localhost ~]# [ $? -eq 0 ] && echo int