代码之家  ›  专栏  ›  技术社区  ›  fluter

if语句中的if子shell语句与复合语句有什么区别?

  •  1
  • fluter  · 技术社区  · 1 年前

    在bash脚本中,我需要运行一个命令,它是 && 复合物,我想知道把它放在潜艇壳里和在里面运行有什么区别 if 条件

    if ! ( cmd_A && cmd_B ); then
        doSth
    fi
    

    vs。

    if ! cmd_A && cmd_B; then
        doSth
    fi
    
    2 回复  |  直到 1 年前
        1
  •  2
  •   chepner    1 年前

    ! 总是仅适用于一个管道。在您的第一个示例中,该管道是 (...) 命令在第二个示例中,它是第一个管道 cmdA 构成的第一部分 列表 由定义 && .

    如果您实际上并不想要子shell,但仍然想否定的退出状态 cmdA && cmdB ,使用命令组:

    if ! { cmdA && cmdB; }; then
        doSth
    fi
    
        2
  •  1
  •   kojiro    1 年前

    ! 将只反转一个命令。

    整个子shell是一个命令,但没有括号, cmd_A 是一个命令,并且 cmd_B 是另一个。

    然而,你对潜艇外壳的强调也可能会让你感到困惑。

    { cmd_A && cmd_B; } 也是一个单一的复合命令,而不是子shell。 ! { cmd_A && cmd_B; } 通常会有类似的行为 ! ( cmd_A && cmd_B ) ,至少就退出状态而言。

    其他复合命令也可用,从开始 { , [[ , (( , for , select , case , if , while until 。所以你可以反转一个整体的结果 如果 表达式,或 对于 循环,如果你愿意的话。