Shell编程 — 判断语句

Shell编程之判断语句

判断语句

if 语句

if

1
2
3
if condition; then
command
fi

if else

1
2
3
4
5
if condition; then
command1
else
command2
fi

if else-if

1
2
3
4
5
6
7
if condition1; then
command1
elif condition2; then
command2
else
commandN
fi

&& || 语句

1
2
3
4
5
6
condition && command;	# 如果condition为真,则执行command
condition || command1; # 如果condition为假,则执行command

# 可用以下语句替代 if else 语句
# 如果condition为真,则执行command1,否则执行command2
condition && command1 || command2;

若执行判断失败,需要退出shell可写成如下形式

1
2
[ 1 -eq 1 ] && echo "true" || { echo "false"; exit 1 }
# 大括号({})内侧两边必须保留一个空格,语句1(echo "false";)与语句2(exit 1)之间必须保留一个空格

切不可写成如下形式:
[ 1 -eq 1 ] && echo “true” || $(echo “false”; exit 1)
退出的是子shell,并不是当前shell

case 语句

1
2
3
4
5
6
7
8
9
10
case 值 in
模式1)
command1
;;
模式2)
command2
;;
*)
;;
esac

判断条件

文件判断

判断符 说明
-e file 如果file存在则为真
-f file 如果file存在且为普通文件则为真
-d file 如果file存在且为目录则为真
-c file 如果file存在且为字符型特殊文件则为真
-b file 如果file存在且为特殊块文件则为真
-p file 如果file存在且为命名管道文件则为真
-S file 如果file存在且为套接字文件则为真
-L file 如果file存在且为符号链接则为真(与-h一致)
-h file 如果file存在且为符号连接则为真(与-L一致)
-r file 如果file存在且可读则为真
-w file 如果file存在且可写则为真
-x file 如果file存在且可执行则为真
-s file 如果file存在且至少有一个字符则为真
-g file 如果file存在且设置了 sgid位则为真
-u file 如果file存在且设置了 suid位则为真
-t fd 如果文件描述已打开且引用了一个终端则为真
file1 -nt file2 如果file1比file2新则为真(指mtime)
file1 -ot file2 如果file1比file2旧则为真(指mtime)
file1 -ef file2 如果file1有硬链接到file2则为真

字符串判断

判断符 说明
-z string string为空则为真
-n string string不为空则为真
string1 = string2 等于则为真
string1 != string1 不相等则为真
string1 > string2 如果string1的字典排序在string2之前则为真(ASCII码顺序)
string1 < string2 如果string1的字典排序在string2之后则为真(ASCII码顺序)

数值判断

判断符 说明
-eq 等于则为真
-ne 不等于则为真
-gt 大于则为真
-ge 大于等于则为真
-lt 小于则为真
-le 小于等于则为真

AND 与 OR

AND: -a 等价于 &&
OR: -o 等价于 ||

使用 [[ ]]判断时,只能使用 && 、||

[]:
[ 1 -eq 1 ] && [ 2 -eq 2 ]
[ 1 -eq 1 -a 2 -eq 2 ]

[[]]:
[[ 1 = 1 ]] && [[ 2 = 2 ]]
[[ 1 = 1 -a 2 = 2 ]]

[] 与 [[]] 区别

[] 几乎在任何shell中都可以用,但是 [[]]仅在 Bash、Zsh和Ksh中可用
[[]] 是 [] 的高级版,字符比较最好使用 [[]]

[]与[[]]之间的异同

特性 [[ ]] [ ]
String comparison > \>
String comparison < \<
Expression grouping ( ) \( \)
Pattern matching = not available
regular Expression =~ not available

  1. 使用 -eq、-lt、-gt ……等数值判断符时,需要确保判断符两侧为整数类型,或可以转换为整数的字符串
    1. 在 []、test 中直接直接报错(integer expression expected)
    2. 在 [[ ]] 中,非整数类型会或不能转换为整数的字符串,将会转换为0之后再进行判断

  2. 使用 =、>、< ……等字符判断符时,需要确保判断符两侧变量存在
    1. 若变量不存在,在 []、test 中直接直接报错(integer expression expected)
    2. 若变量不存在,在 [[ ]] 中,会将其转换为空字符(’’)进行判断

参考

Linux Shell命令行及脚本编程实例详解 (第6章)