1. test
和[ ]
1.1 运算符
test
和[ ]
是等价的,兼容性最好,都是 POSIX 标准,在各种 Shell 环境中都能工作(包括 /bin/sh
)
可以判断三类条件:
- 整数比较
-eq
/-ne
/-ge
/-gt
/-le
/-lt
- 字符串比较
=
/!=
/<
/>
/-n
/-z
- 文件比较
-d
/-e
/-f
/-r
/-s
/-w
/-x
/-O
/-G
/-nt
/-ot
1.2 复合逻辑判断
- 逻辑与:
&&
或-a
✅推荐:[ "$a" -lt 10 ] && [ "$b" -gt 5 ]
❌不推荐:[ "$a" -lt 10 -a "$b" -gt 5 ]
- 逻辑或:
-o
或||
✅推荐:[ "$a" -lt 10 ] || [ "$b" -gt 5 ]
❌不推荐:[ "$a" -lt 10 -o "$b" -gt 5 ]
- 逻辑非:
!
[ ! "$a" -lt 10 ]
注意:!
后面一定要加上一个空格,否则会把!
和后面$a
的内容当做一个整体的字符串。
1.3 注意点
- 每个变量都应加引号以防止空值引起语法错误
如果不加引号,当$a
为空时,shell 会把[ $a == "hello" ]
解释成[ == "hello" ]
,因为缺少一个操作数,所以脚本会报错。
a=""
if [ $a == "hello" ]; then
echo "OK"
如果加引号,当$a
为空时,shell 会把[ "$a" == "hello" ]
解释成[ "" == "hello" ]
,这样可以确保空值也能被正常处理
a=""
if [ "$a" == "hello" ]; then
echo "OK"
- 字符串比较中,
>
和<
必须转义,否则 shell 会把它们当做重定向符号
if [ $val1 \> $val2 ] # 这里需要转义符号
- 只能处理整数数值,不能处理浮点数
test <condition>
与[ <condition> ]
等价比如[ "$a" -lt 10 ] && [ "$b" -gt 5 ]
和test "$a" -lt 10 && test "$b" -gt 5
是一样的
2. [[ ]]
2.1 [[ ]]
与[]
的相同点
[[ ]]
是 Bash 提供的增强型条件判断语法,可以完全兼容[ ]
条件判断,但不适用于/bin/sh
2.2 [[ ]]
与[]
的不同点
在整数比较、文件比较上,与[]
是一致的,但字符串比较功能更丰富,支持通配符以及正则表达式(使用=~
),如:
- 通配符:
[[ $var == *.txt ]]`
- 正则表达式:
[[ $var =~ ^file[0-9]+\.txt$ ]]
另外,还有以下不同点:
- 不需要引号,可以安全地使用变量,即使变量为空或包含空格,shell 会自动处理 a=””
if [ $a = “hello” ]; then
echo “OK” - 不需要多个
[[ ]]
来构建复合逻辑判断使用[ ]
时,复合逻辑判断:[ "$a" -lt 10 ] && [ "$b" -gt 5 ]
;使用[[ ]]
时,复合逻辑判断可以直接在一个[[ ]]
中:[[ $a -lt 10 && $b -gt 5 ]]
- 字符串比较中,
>
和<
不需要转义
3. (( ))
3.1 运算符汇总
(( ))
是 Bash 中专门用于整数算数运算和整数条件判断的语法。
算数运算符
+
/-
/*
//
/%
/val++
/val--
/++val
/--val
/**
位运算符
~
/&
/|
/<<
/>>
比较运算符
>
/<
/>=
/<=
/==
/!=
逻辑运算符
&&
/||
/!
3.2 注意点
>
和<
不需要转义