shell中if [] 和 if [[]] 区别

177 阅读1分钟

在 Shell 脚本中,条件语句 if [] 和 if [[]] 都用于测试条件,但它们有一些关键的区别。了解这些差异可以帮助你编写更可靠和高效的脚本。

if [] (单中括号)

单中括号是 POSIX 标准的一部分,几乎在所有的 Unix 和 Linux 系统上都可以使用。它实际上是 test 命令的另一种语法形式。

基本用法

if [ condition ]; then
    # commands
fi

特点和限制

  1. 字符串比较

    if [ "$a" = "$b" ]; then
        echo "a is equal to b"
    fi
    
  2. 整数比较

    if [ "$a" -eq "$b" ]; then
        echo "a is equal to b"
    fi
    
  3. 文件测试

    if [ -f "file.txt" ]; then
        echo "file.txt exists"
    fi
    
  4. 逻辑操作
    使用 -a 和 -o 进行逻辑 AND 和 OR 操作。

    if [ "$a" -eq 1 -a "$b" -eq 2 ]; then
        echo "Both conditions are true"
    fi
    
  5. 注意事项

    • 必须在条件表达式的两边有空格,否则会报错。
    • 逻辑操作符 -a 和 -o 有时会导致不明确的行为。

if [[]] (双中括号)

双中括号是 Bash 的扩展,提供了更强大的功能和更灵活的语法。

基本用法

if [[ condition ]]; then
    # commands
fi

特点和优势

  1. 字符串比较

    if [[ "$a" == "$b" ]]; then
        echo "a is equal to b"
    fi
    
  2. 模式匹配
    支持模式匹配(类似于文件通配符)。

    if [[ "$a" == *.txt ]]; then
        echo "a is a .txt file"
    fi
    
  3. 整数比较

    if [[ "$a" -eq "$b" ]]; then
        echo "a is equal to b"
    fi
    
  4. 文件测试

    if [[ -f "file.txt" ]]; then
        echo "file.txt exists"
    fi
    
  5. 逻辑操作
    使用 && 和 || 进行逻辑 AND 和 OR 操作。

    if [[ "$a" -eq 1 && "$b" -eq 2 ]]; then
        echo "Both conditions are true"
    fi
    
  6. 注意事项

    • 不需要在条件表达式的两边有空格。
    • 更加灵活和强大,适用于更复杂的条件判断。
    • 支持正则表达式匹配(使用 =~ 操作符)。

总结

  • if []

    • 是 POSIX 标准的一部分,几乎在所有 Unix 和 Linux 系统上都可用。
    • 适用于基本的条件测试。
    • 对于复杂的条件测试,语法较为繁琐。
  • if [[]]

    • 是 Bash 的扩展,提供了更强大的功能。
    • 适用于复杂的条件测试和模式匹配。
    • 更加灵活,推荐在 Bash 脚本中使用。

选择哪种语法取决于你的具体需求和脚本的复杂性。如果你需要编写跨平台的脚本,if [] 可能是更好的选择。如果你在 Bash 环境中工作,并且需要更强大的功能,if [[]] 是更好的选择。

判断句里还可以写很多 逻辑运算符 如:

if[[[ -n $a ]]]

检测字符串长度是否为0,不为0返回 true。 详细可参考:www.w3cschool.cn/linux/linux…