Shell 脚本的条件测试与比较

Shell脚本
398
0
0
2023-02-18

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