bash - Bash 中的 [ 和 [[ 有什么区别?

标签 bash

<分区>

我查看了 bash 手册页,[[ 说它使用条件表达式。然后我查看了条件表达式部分,它列出了与 test(和 [)相同的运算符。

所以我想知道,Bash 中的 [[[ 有什么区别?

最佳答案

[[是 bash 对 [ 的改进命令。如果您编写以 bash 为目标的脚本,它有几个增强功能,使它成为更好的选择。我最喜欢的是:

  1. 它是 shell 的语法特征,所以它有一些特殊的行为 [没有。您不再需要疯狂地引用变量,因为 [[更直观地处理空字符串和带空格的字符串。例如,使用 [你必须写

    if [ -f "$file" ]
    

    正确处理空字符串或包含空格的文件名。与 [[引号是不必要的:

    if [[ -f $file ]]
    
  2. 因为它是一个句法特征,所以它可以让你使用 &&|| bool 测试运算符和 <>用于字符串比较。 [无法执行此操作,因为它是常规命令并且 && , || , < , 和 >不会作为命令行参数传递给常规命令。

  3. 它有一个美妙的=~用于进行正则表达式匹配的运算符。与 [你可能会写

    if [ "$answer" = y -o "$answer" = yes ]
    

    [[你可以这样写

    if [[ $answer =~ ^y(es)?$ ]]
    

    它甚至可以让您访问存储在 BASH_REMATCH 中的捕获组.例如,${BASH_REMATCH[1]}如果您在上方键入完整的"is",则为“es”。

  4. 您可以免费获得模式匹配,也就是 globbing。也许您对如何输入 yes 没有那么严格。如果用户输入 y-anything,也许你没问题。让你满意:

    if [[ $ANSWER = y* ]]
    

请记住,它是一个 bash 扩展,因此如果您正在编写与 sh 兼容的脚本,那么您需要坚持使用 [。 .确保你有 #!/bin/bash如果你使用双括号,你的脚本的 shebang 行。

另见

关于bash - Bash 中的 [ 和 [[ 有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3427872/

相关文章:

linux - 如何删除空格后的每个字符?

bash - 如何从 GHC/Cabal/Stack 获取错误和警告计数?

找不到 MySQL 命令 [MAMP]

linux - 为什么 bash 的 flock with timeout 获取锁失败不退出?

linux - 如何在 bash 脚本中循环遍历子目录?

linux - sed 的奇怪输出

regex - sed 从 ip 中删除前两个八位字节

linux - Bash - 获取两个字符之间的字符串

bash - 是否可以为 SSH 编写 'no-op' 代理命令?

c++ - Makefile 空白参数导致 shell 出错