【问题标题】:Can I omit the then part in an if statement?我可以省略 if 语句中的 then 部分吗?
【发布时间】:2015-07-15 12:27:22
【问题描述】:

对于这样的事情,正确的 bash 语法是怎样的:

if [ "$actual" == "$expected" ]; then 
  doNothing
else 
  echo "Error: actual: $actual. Expected: $expected"
fi

我正在寻找适用于变量“实际”和“预期”的所有可能值的东西。不得以任何方式解释/评估/扩展变量的内容。该脚本不需要是可移植的(仅 bash 的解决方案是可以的)。

【问题讨论】:

    标签: bash


    【解决方案1】:

    您可以使用最简单的“无所事事”语句:

    if [ "$actual" = "$expected" ]; then 
      :
    else 
      echo "Error: actual: $actual. Expected: $expected"
    fi
    

    (注意:= 不是两个[/test。)

    但更好的办法是反转测试并完全消除对它的需求:

    if [ "$actual" != "$expected" ]; then
      echo "Error: actual: $actual. Expected: $expected"
    fi
    

    【讨论】:

    • 我刚刚在这里阅读了一个接受的答案(我无法再次找到它),建议使用 == 而不是 = 。有什么不同?对于简单的情况,两者似乎都有效。 == 的否定是什么?是 !== 吗?。
    • POSIX [/test 使用 = 表示相等,!= 表示不相等 (ref)。 bash(可能还有许多其他 shell)在该用法中也接受 ==,但它不是严格规范。特定于 bash 的 [[ 内置测试语法 (ref) 使用 ==/!=(但为了理智,也接受 =)。
    • 是否应该使用 [ 或 [[ 似乎没有共识。
    • 它们是不同的。 [ 是可移植的。 [[ 是一种 bash 主义。 [[ 有一些很好的安全属性,[ 没有(但也至少有一个缺点,请参阅我对 DevSolar 答案的评论)。 [[ 支持一些 [ 不支持的测试。
    • “不是严格规范”是什么意思?我认为不同的外壳不兼容?
    【解决方案2】:

    你试过了吗:

    if [ "$actual" != "$expected" ]; then 
      echo "Error: actual: $actual. Expected: $expected"
    fi
    

    【讨论】:

    • -ne 是数字比较 != 是字符串比较。它们是不等价的。
    • 究竟有什么区别?变量也可以包含数值,不是吗?包含数字 1 或文本 1 的变量有区别吗?
    • 不同之处在于该值不是数字。 [ 5 = 5 ] 和 [ 5 -ne 3 ] 都为 true,但 [ 5 -ne foo ] 将是运行时错误,而 [ 5 != foo ] 将为 false。
    • 如果我事先不知道变量中包含字符串或数值或其他内容,我应该使用什么?
    • @etan: 07 和 7 是相同的数字和不同的字符串。举个例子。
    【解决方案3】:
    if [[ $actual != $expected ]]
    then
        echo "Error: actual: $actual. Expected: $expected"
    fi
    

    使用内置的[[ 比test / [ 有几个优点。一方面,如果你不引用包含空格的变量,你就不会被咬。

    [[ ]] 还提供< 和> 用于区域感知字典排序、正则表达式匹配和=~。检查man bash。

    (请注意 Etan 对至少一个不同意见的评论。我还没有决定这是一个劣势还是一个可以利用的功能,但这确实令人惊讶。)

    也可以将then 放在单独的一行,但这只是个人喜好。

    【讨论】:

    • 为什么不扩展[[ 相对于[ 的优势?
    • [[ 在数字比较方面也有(至少)一个缺点。它递归地扩展非数字值(请参阅我的问题here 了解一点)。
    • @arco444:我添加了问题范围内的差异。
    • @Etan:很好的捕捉和警告。
    • 这些优势是什么? then 在单独的行上有什么问题? [[ 和 [ 的确切区别是什么?
    猜你喜欢
    • 2012-03-03
    • 1970-01-01
    • 1970-01-01
    • 2020-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-12
    相关资源
    最近更新 更多