Shell 脚本的条件测试与比较

Shell脚本条件测试

语法 说明
test 利用test命令进行条件测试
[] 通过[]进行条件测试
[[]] 通过[[]]进行条件测试
(()) 通过(())进行条件测试

test语法

test -f file && echo true || echo false  #存在输出true,不存在输出false

[]语法

[ -f /tmp/123.txt ] && echo 1 || echo 0 #存在输出1,不存在输出0

[[]]语法

[[ -f /tmp/123.txt ]] &&echo 1 || echo 0 #存在输出1,不存在输出0

文件测试表达式

文件测试操作符 说明
-d 文件 文件存在且为目录为真,及测试表达式成立
-f 文件 文件存在且为普通文件为真,及测试表达式成立
-e 文件 文件存在即为真,则表达式成立,不区别文件和目录
-r 文件 文件存在且可读为真,及测试表达式成立
-w 文件 文件存在且可写为真,及测试表达式成立
-x 文件 文件存在且可执行为真,及测试表达式成立
-s 文件 文件存在且文件大小不为0为真,及测试表达式成立
-L 文件 文件存在且为链接文件为真,及测试表达式成立
f1 -nt f2 文件f1比文件f2新则为真,即表达式成立,根据文件的修改时间来计算
f1 -ot f2 文件f1比文件f2旧则为真,即表达式成立,根据文件的修改时间来计算

字符串测试表达式

字符串测试符 说明
-n “字符串” 若字符串不为“0”,则为真,即表达式成立
-z “字符串” 若字符串为“0”,则为真,即表达式成立
“串1” = “串2” 若字符串1等于字符串2,则为真,即表达式成立
“串1” != “串2” 若字符串1不等于字符串2,则为真,即表达式成立

整数二次元比较符

在[]以及test中使用的比较符 在(())和[[]]中使用的比较符 说明
-eq ==或者= 相等
-ne != 不相等
-gt > 大于
-ge >= 大于等于
-lt < 小于
-le <= 小于等于
root@cs:/server/scripts# a1=98;a2=64
root@cs:/server/scripts# [ "$a1" -eq "$a2" ] && echo 1 || echo 00
root@cs:/server/scripts# [ "$a1" -ne "$a2" ] && echo 1 || echo 01
root@cs:/server/scripts# [ "$a1" -gt "$a2" ] && echo 1 || echo 01
root@cs:/server/scripts# [ "$a1" -lt "$a2" ] && echo 1 || echo 00

逻辑操作符

在[]和test中使用的操作符 在[[]]和(())中使用的操作符 说明
-a && and,与,两端为真,则结果为真
-o 双竖线 or,或,两端一个为真,则结果为真
! ! not,非,两端相反,则结果为真

使用-a和&&时

当左边为真,右边为假时,结果为假。
当左边为假,右边为真时,结果为假。
当左边为真,右边为真时,结果为真。
当左边为假,右边为假时,结果为假。

root@cs:/server/scripts# [ 5 -eq 6 -a 7 -ne 5 ] && echo 1 || echo 0   #5等于7?假 7不等于5? 真   结果为假 输出0
0
root@cs:/server/scripts# [ 5 -lt 6 -a 7 -ne 5 ] && echo 1 || echo 0   #5<7?真 7不等于5? 真   结果为真 输出1
1

使用-o 或 双竖线时

当左边为真,右边为假时,结果为真。
当左边为假,右边为真时,结果为真。
当左边为真,右边为真时,结果为真。
当左边为假,右边为假时,结果为假。

root@cs:/server/scripts# [ 5 -lt 6 -o 7 -ne 5 ] && echo 1 || echo 0
1
root@cs:/server/scripts# [ 5 -eq 6 -o 7 -ne 5 ] && echo 1 || echo 0
1
root@cs:/server/scripts# [ 5 -gt 6 -o 7 -lt 5 ] && echo 1 || echo 0
0
root@cs:/server/scripts# f1=/etc/rc.local;f2=/etc/services
root@cs:/server/scripts# echo -ne "$f1 $f2\n"
/etc/rc.local /etc/services
root@cs:/server/scripts# [ -f "$f1" -a -f "$f2" ] && echo 1 || echo 0
1
root@cs:/server/scripts# [ -f "$f1" -a -f "$f222" ] && echo 1 || echo 0
0
root@cs:/server/scripts# [ -f "$f1" -o -f "$f222" ] && echo 1 || echo 0
1
root@cs:/server/scripts# [ -f "$f111" -o -f "$f222" ] && echo 1 || echo 0
0
root@cs:/server/scripts# [ -f "$f1" ] && [ -f "$f2" ] && echo 1 || echo 0
1
 root@cs:/server/scripts# a="test";b="echo"
root@cs:/server/scripts# echo -eq "$a $b\n"
-eq test echo\n
root@cs:/server/scripts# echo -ne "$a $b\n"
test echo
root@cs:/server/scripts# [[ ! -n "$a" && "$a" = "$b" ]] && echo 0 || echo 1
1
root@cs:/server/scripts# [[ -z "$a" && "$a" != "$b" ]] && echo 0 || echo 1
1
root@cs:/server/scripts# [[ -z "$a" || "$a" != "$b" ]] && echo 0 || echo 1
0
root@cs:/server/scripts# [[ -z "$a" -o "$a" != "$b" ]] && echo 0 || echo 1
-bash: syntax error in conditional expression
-bash: syntax error near `-o'
root@cs:/server/scripts# m=21;n=38
root@cs:/server/scripts# [ $m -gt 20 -a $n -lt 30 ] && echo 1 || echo 0
0
root@cs:/server/scripts# [ $m -gt 20 ] && [ $n -lt 30 ] && echo 1 || echo 0
0
root@cs:/server/scripts# [ $m -gt 20 ] || [ $n -lt 30 ] && echo 1 || echo 0
1

逻辑操作符

输入或通过命令行输入一个数字,如果传入的数字等于1,就打印1,输入2,就打印2,输入其他数字就退出程序

root@cs:/server/scripts# cat ljczf.sh
#!/bin/bash
read -p "please input  num:" num 
[ "$num" = "1" ] && {
echo 1
exit 0
}

[ "$num" = "2" ] && {
echo 2
exit 0
}

[ "$num" != "1" -a "$num" != "2" ] && {
echo error
exit 1
}
传参方式
root@cs:/server/scripts# cat ljczf1.sh 
#!/bin/bash
echo "plase input num"
num=$1
[ "$num" = "1" ] && {
echo 1
exit 0
}
[ "$num" = "2" ] && {
echo 2
exit 0
}
[ "$num" !=  "1" -a "$num" != "2" ] &&
    {
    echo error
exit 1
}

比较两个整数的大小

root@cs:/server/scripts# cat int.sh
#!/bin/bash
read -p "pls input two num:" num1 num2
[ -z "$num1" -a -z "$num2" ] && {
echo error 
exit 1
}
expr $num1 + 1 &>/dev/null
RETVAL_n1=$?
expr $num2 + 1 &>/dev/null
RETVAL_n2=$?
[ $RETVAL_n1 -eq 0 -a $RETVAL_n2 -eq 0 ] || {
echo "pls input two num again"
exit 2
}
[ $num1 -lt $num2 ] && {
echo "$num1 < $num2"
exit 0
}
[ $num1 -eq $num2 ] && {
echo "$num1 = $num2"
exit 0
}
[ $num1 -gt $num2 ] && {
echo "$num1 > $num2" 
}


root@cs:/server/scripts# sh int.sh
pls input two num:6 3
6 > 3
root@cs:/server/scripts# sh int.sh
pls input two num:3 6
3 < 6
root@cs:/server/scripts# sh int.sh
pls input two num:6 6
6 = 6
root@cs:/server/scripts# sh int.sh
pls input two num:dd ff
pls input two num again
root@cs:/server/scripts# cat int1.sh 
#!/bin/bash
num1=$1
num2=$2
[ $# -ne 2 ] && {
echo "USAGE:$0 num1 num2"
exit 1
}

expr $num1 + 1 &>/dev/null
RETVAL_n1=$?
expr $num2 + 1 &>/dev/null
RETVAL_n2=$?
[ $RETVAL_n1 -eq 0 -a $RETVAL_n2 -eq 0 ] || {
echo "pls input two num again"
exit 2
}
[ $num1 -lt $num2 ] && {
echo "$num1 < $num2"
exit 0
}
[ $num1 -eq $num2 ] && {
echo "$num1 = $num2"
exit 0
}
[ $num1 -gt $num2 ] && {
echo "$num1 > $num2" 
}

root@cs:/server/scripts# sh int1.sh 6 3
6 > 3
root@cs:/server/scripts# sh int1.sh 3 6
3 < 6
root@cs:/server/scripts# sh int1.sh 3 3
3 = 3
root@cs:/server/scripts# sh int1.sh dd ff
pls input two num again
THE END
点赞7投币 分享
评论 抢沙发

请登录后发表评论

    请登录后查看评论内容