Shell Scripting Ternary运算符获取字符串结果

问题描述 投票:5回答:3

在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
3个回答
4
投票

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

在某些情况下,shell允许计算算术表达式(参见let和declare builtin命令和算术扩展)。评估是在固定宽度的整数中完成的,没有检查溢出,但除以0被捕获并标记为错误。运算符及其优先级,关联性和值与C语言中的相同。以下运算符列表分组为等优先运算符的级别。级别按优先级递减的顺序列出。 (......)

EXPR EXPR:EXPR

条件运算符

当你使用resVar0时,"Yop"被赋予"Nop"的原因是因为这样的字符串在bash中不是有效数字,因此它被评估为0。它也在同一段中的man bash中解释:

空值的计算结果为0。

如果你觉得它更容易阅读,它也会在this Wikipedia article中解释:

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

((result = condition?value_if_true:value_if_false))

对于字符串,只存在变通方法,例如:

result = $([“$ a”==“$ b”] && echo“value_if_true”|| echo“value_if_false”)

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


1
投票

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))]}"

0
投票

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

resVar=$([ numVar == numVal  ] && echo "Yop" || echo "Nop")
© www.soinside.com 2019 - 2024. All rights reserved.