在 Shell 脚本中,条件语句 if [] 和 if [[]] 都用于测试条件,但它们有一些关键的区别。了解这些差异可以帮助你编写更可靠和高效的脚本。
if [] (单中括号)
单中括号是 POSIX 标准的一部分,几乎在所有的 Unix 和 Linux 系统上都可以使用。它实际上是 test 命令的另一种语法形式。
基本用法
if [ condition ]; then
# commands
fi
特点和限制
-
字符串比较:
if [ "$a" = "$b" ]; then echo "a is equal to b" fi -
整数比较:
if [ "$a" -eq "$b" ]; then echo "a is equal to b" fi -
文件测试:
if [ -f "file.txt" ]; then echo "file.txt exists" fi -
逻辑操作:
使用-a和-o进行逻辑 AND 和 OR 操作。if [ "$a" -eq 1 -a "$b" -eq 2 ]; then echo "Both conditions are true" fi -
注意事项:
- 必须在条件表达式的两边有空格,否则会报错。
- 逻辑操作符
-a和-o有时会导致不明确的行为。
if [[]] (双中括号)
双中括号是 Bash 的扩展,提供了更强大的功能和更灵活的语法。
基本用法
if [[ condition ]]; then
# commands
fi
特点和优势
-
字符串比较:
if [[ "$a" == "$b" ]]; then echo "a is equal to b" fi -
模式匹配:
支持模式匹配(类似于文件通配符)。if [[ "$a" == *.txt ]]; then echo "a is a .txt file" fi -
整数比较:
if [[ "$a" -eq "$b" ]]; then echo "a is equal to b" fi -
文件测试:
if [[ -f "file.txt" ]]; then echo "file.txt exists" fi -
逻辑操作:
使用&&和||进行逻辑 AND 和 OR 操作。if [[ "$a" -eq 1 && "$b" -eq 2 ]]; then echo "Both conditions are true" fi -
注意事项:
- 不需要在条件表达式的两边有空格。
- 更加灵活和强大,适用于更复杂的条件判断。
- 支持正则表达式匹配(使用
=~操作符)。
总结
-
if []:- 是 POSIX 标准的一部分,几乎在所有 Unix 和 Linux 系统上都可用。
- 适用于基本的条件测试。
- 对于复杂的条件测试,语法较为繁琐。
-
if [[]]:- 是 Bash 的扩展,提供了更强大的功能。
- 适用于复杂的条件测试和模式匹配。
- 更加灵活,推荐在 Bash 脚本中使用。
选择哪种语法取决于你的具体需求和脚本的复杂性。如果你需要编写跨平台的脚本,if [] 可能是更好的选择。如果你在 Bash 环境中工作,并且需要更强大的功能,if [[]] 是更好的选择。
判断句里还可以写很多 逻辑运算符 如:
if[[[ -n $a ]]]
检测字符串长度是否为0,不为0返回 true。 详细可参考:www.w3cschool.cn/linux/linux…