Shell 条件表达式

本文最后更新于:2024年3月18日 凌晨

Shell 条件表达式

逻辑条件表达式

运算符 说明 举例
== 相等,用于比较两个数字,相同则返回 true, [ $a == $b ]
!= 不相等,用于比较两个数字,不相同则返回 true, [ $a != $b ]
! 非运算,表达式为 true 则返回 false,否则返回 true, [ ! false ]
&& 逻辑的 AND [[ $a -lt 100 && $b -gt 100 ]]
|| 逻辑的 OR `[[ $a -lt 100

注意:

  • 条件表达式要放在方括号之间,并且要有空格,例如: [$a==$b]是错误的,必须写成 [ $a == $b ],如果包含两个条件表达式,则用[[]]
  • shell 语言中 0 代表 true,0 以外的值代表 false
  • 两个*在运算时代表次方。

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
#!/bin/bash

a=10
b=20

if [ $a == $b ]
then
echo "a 等于 b"
fi
if [ $a != $b ]
then
echo "a 不等于 b"
fi

if [ $a == ! $b ]
then
echo "$a == !$b : a 等于非b"
else
echo "$a != !$b: a 不等于非b"
fi

if [[ $a -lt 100 && $b -gt 100 ]]
then
echo "返回 true"
else
echo "返回 false"
fi

if [[ $a -lt 100 || $b -gt 100 ]]
then
echo "返回 true"
else
echo "返回 false"
fi

注意:

  • 乘号*前边必须加反斜杠\才能实现乘法运算。
  • 在 MAC 中 shell 的 expr 语法是:$((表达式)),此处表达式中的*不需要转义符号\

关系条件表达式

运算符 说明 举例
-o 或运算,有一个表达式为 true 则返回 true, [ $a -lt 20 -o $b -gt 100 ]
-a 与运算,两个表达式都为 true 才返回 true, [ $a -lt 20 -a $b -gt 100 ]
-eq 检测两个数是否相等,相等返回 true, [ $a -eq $b ]
-ne 检测两个数是否不相等,不相等返回 true, [ $a -ne $b ]
-gt 检测左边的数是否大于右边的,如果是,则返回 true, [ $a -gt $b ]
-lt 检测左边的数是否小于右边的,如果是,则返回 true, [ $a -lt $b ]
-ge 检测左边的数是否大于等于右边的,如果是,则返回 true, [ $a -ge $b ]
-le 检测左边的数是否小于等于右边的,如果是,则返回 true, [ $a -le $b ]

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#!/bin/bash

a=10
b=20

if [ $a -lt 100 -a $b -gt 15 ]
then
echo "$a 小于 100 且 $b 大于 15 :返回 true"
else
echo "$a 小于 100 且 $b 大于 15 :返回 false"
fi
if [ $a -lt 100 -o $b -gt 100 ]
then
echo "$a 小于 100 或 $b 大于 100 :返回 true"
else
echo "$a 小于 100 或 $b 大于 100 :返回 false"
fi
if [ $a -lt 5 -o $b -gt 100 ]
then
echo "$a 小于 5 或 $b 大于 100 :返回 true"
else
echo "$a 小于 5 或 $b 大于 100 :返回 false"
fi

if [ $a -eq $b ]
then
echo "$a -eq $b : a 等于 b"
else
echo "$a -eq $b: a 不等于 b"
fi
if [ $a -ne $b ]
then
echo "$a -ne $b: a 不等于 b"
else
echo "$a -ne $b : a 等于 b"
fi
if [ $a -gt $b ]
then
echo "$a -gt $b: a 大于 b"
else
echo "$a -gt $b: a 不大于 b"
fi
if [ $a -lt $b ]
then
echo "$a -lt $b: a 小于 b"
else
echo "$a -lt $b: a 不小于 b"
fi
if [ $a -ge $b ]
then
echo "$a -ge $b: a 大于或等于 b"
else
echo "$a -ge $b: a 小于 b"
fi
if [ $a -le $b ]
then
echo "$a -le $b: a 小于或等于 b"
else
echo "$a -le $b: a 大于 b"
fi

字符串条件表达式

运算符 说明 举例
= 检测两个字符串是否相等,相等返回 true, [ $a = $b ]
!= 检测两个字符串是否不相等,不相等返回 true, [ $a != $b ]
-z 检测字符串长度是否为0,为0返回 true, [ -z $a ]
-n 检测字符串长度是否不为 0,不为 0 返回 true, [ -n "$a" ]
$ 检测字符串是否为空,不为空返回 true, [ $a ]

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
#!/bin/bash

a="abc"
b="efg"

if [ $a = $b ]
then
echo "$a = $b : a 等于 b"
else
echo "$a = $b: a 不等于 b"
fi
if [ $a != $b ]
then
echo "$a != $b : a 不等于 b"
else
echo "$a != $b: a 等于 b"
fi
if [ -z $a ]
then
echo "-z $a :字符串长度为 0"
else
echo "-z $a :字符串长度不为 0"
fi
if [ -n "$a" ]
then
echo "-n $a :字符串长度不为 0"
else
echo "-n $a :字符串长度为 0"
fi
if [ $a ]
then
echo "$a :字符串不为空"
else
echo "$a :字符串为空"
fi

文件条件表达式

  • 文件测试运算符用于检测 Unix 文件的各种属性。
  • 属性检测描述如下:
操作符 说明 举例
-b file 检测文件是否是块设备文件,如果是,则返回 true, [ -b $file ]
-c file 检测文件是否是字符设备文件,如果是,则返回 true, [ -c $file ]
-d file 检测文件是否是目录,如果是,则返回 true, [ -d $file ]
-f file 检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true, [ -f $file ]
-g file 检测文件是否设置了 SGID 位,如果是,则返回 true, [ -g $file ]
-k file 检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true, [ -k $file ]
-p file 检测文件是否是有名管道,如果是,则返回 true, [ -p $file ]
-u file 检测文件是否设置了 SUID 位,如果是,则返回 true, [ -u $file ]
-r file 检测文件是否可读,如果是,则返回 true, [ -r $file ]
-w file 检测文件是否可写,如果是,则返回 true, [ -w $file ]
-x file 检测文件是否可执行,如果是,则返回 true, [ -x $file ]
-s file 检测文件是否为空(文件大小是否大于0),不为空返回 true, [ -s $file ]
-e file 检测文件(包括目录)是否存在,如果是,则返回 true, [ -e $file ]
-S file 判断某文件是否 Socket [ -S $file ]
-L file 检测文件是否存在并且是一个符号链接 [ -L $file ]

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
#!/bin/bash


file="/var/www/test/test.sh"
if [ -r $file ]
then
echo "文件可读"
else
echo "文件不可读"
fi
if [ -w $file ]
then
echo "文件可写"
else
echo "文件不可写"
fi
if [ -x $file ]
then
echo "文件可执行"
else
echo "文件不可执行"
fi
if [ -f $file ]
then
echo "文件为普通文件"
else
echo "文件为特殊文件"
fi
if [ -d $file ]
then
echo "文件是个目录"
else
echo "文件不是个目录"
fi
if [ -s $file ]
then
echo "文件不为空"
else
echo "文件为空"
fi
if [ -e $file ]
then
echo "文件存在"
else
echo "文件不存在"
fi

test 命令

Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值,字符和文件三个方面的测试。

数值测试

1
2
3
4
5
6
7
8
num1=100
num2=100
if test $[num1] -eq $[num2]
then
echo '两个数相等!'
else
echo '两个数不相等!'
fi
  • 输出结果:
1
两个数相等!

字符串测试

参数 说明
-z 字符串 字符串的长度为零则为真
-n 字符串 字符串的长度不为零则为真

实例

1
2
3
4
5
6
7
8
num1="test1"
num2="test2"
if test $num1 = $num2
then
echo '两个字符串相等!'
else
echo '两个字符串不相等!'
fi
  • 输出结果:
1
两个字符串不相等!

文件测试

参数 说明
-e 文件名 如果文件存在则为真
-r 文件名 如果文件存在且可读则为真
-w 文件名 如果文件存在且可写则为真
-x 文件名 如果文件存在且可执行则为真
-s 文件名 如果文件存在且至少有一个字符则为真
-d 文件名 如果文件存在且为目录则为真
-f 文件名 如果文件存在且为普通文件则为真
-c 文件名 如果文件存在且为字符型特殊文件则为真
-b 文件名 如果文件存在且为块特殊文件则为真

实例

1
2
3
4
5
6
7
cd /bin
if test -e ./bash
then
echo '文件已存在!'
else
echo '文件不存在!'
fi
  • 输出结果:
1
文件已存在!
  • 另外,Shell 还提供了与( -a ),或( -o ),非( ! )三个逻辑操作符用于将测试条件连接起来,其优先级为:! 最高,-a 次之,-o最低,例如:
1
2
3
4
5
6
7
cd /bin
if test -e ./notFile -o -e ./bash
then
echo '至少有一个文件存在!'
else
echo '两个文件都不存在'
fi
  • 输出结果:
1
至少有一个文件存在!

本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!