【问题标题】:Shell Scripting Ternary operator to get string resultShell Scripting 三元运算符获取字符串结果
【发布时间】:2018-06-11 00:43:37
【问题描述】:

在 shell 脚本中,我使用的是这样的三元运算符:

(( numVar == numVal ? (resVar=1) : (resVar=0) ))

我观看了 Derek Banas 的 shell 脚本教程,并在视频的 41:00 获得了上述语法

https://www.youtube.com/watch?v=hwrnmQumtPw&t=73s

当我们将数字分配给resVar 时,上面的代码有效,但如果我尝试将字符串分配给resVar,它总是返回0。

(( numVar == numVal ? (resVar="Yop") : (resVar="Nop") ))

也试过了

resVar=$(( numVar == numVal ? (echo "Yop") : (echo "Nop") ))

那么正确的做法是什么?

【问题讨论】:

    标签: string shell scripting ternary-operator


    【解决方案1】:

    您没有告诉我们您使用的是什么外壳,但您可以使用 bash 或类似的东西。 Bash 中的三元运算符仅适用于数字 在man bashARITHMETIC EVALUATION 部分解释:

    shell 允许计算算术表达式,在 某些情况下(参见 let 和 declare 内置命令和 算术展开)。评估以固定宽度的整数进行 不检查溢出,尽管除以 0 被捕获并且 标记为错误。运算符及其优先级, 关联性和值与 C 语言中的相同。这 以下运算符列表分为以下级别 等优先运算符。级别按顺序列出 降低优先级。
    (...)

    expr?expr:expr

    条件运算符

    以及使用"Yop"resVar分配0的原因或 "Nop" 是因为这样的字符串不是bash 中的有效数字和 因此它被评估为0。在man bash中也有解释 同一段:

    空值的计算结果为 0。

    如果你找到它,this Wikipedia article 也有解释 更容易阅读:

    真正的三元运算符只存在于算术表达式中:

    ((结果 = 条件 ? value_if_true : value_if_false))

    对于字符串,只有解决方法,例如:

    结果=$([ "$a" == "$b" ] && echo "value_if_true" || echo "value_if_false")

    (其中 "$a" == "$b" 可以是任何条件测试,各自的 [, 可以 评估。)

    【讨论】:

      【解决方案2】:

      Arkadiusz 已经指出三元运算符是 bash 中的算术特性,不能用于字符串。如果你想在字符串中使用这种功能,你总是可以使用数组:

      $ arr=(Nop Yop)
      $ declare -p arr
      declare -a arr='([0]="Nop" [1]="Yop")'
      $ numVar=5; numVal=5; resvar="${arr[$((numVar == numVal ? 1 : 0))]}"; echo "$resvar"
      Yop
      $ numVar=2; numVal=5; resvar="${arr[$((numVar == numVal ? 1 : 0))]}"; echo "$resvar"
      Nop
      

      当然,如果您只是在处理数组中可能位于位置01 的两个值,则不需要三元;以下实现了同样的事情:

      $ resvar="${arr[$((numVar==numVal))]}"
      

      【讨论】:

        【解决方案3】:

        你可以使用这个简单的表达方式:

        resVar=$([ numVar == numVal  ] && echo "Yop" || echo "Nop")
        

        【讨论】:

        • 不建议这样做。 &&|| 具有相同的优先级,因此要按预期工作,第二个命令 cannot 具有非零退出状态。如果b 失败,a && b || c 仍将运行c,这与预期相反。请改用if a; then b; else c; fi
        猜你喜欢
        • 2016-06-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-04-10
        • 2012-12-19
        • 1970-01-01
        • 2013-09-29
        • 2022-01-11
        相关资源
        最近更新 更多