Suj*_*U N 5 string shell scripting ternary-operator
在shell脚本中,我使用这样的三元运算符:
(( numVar == numVal ? (resVar=1) : (resVar=0) ))
Run Code Online (Sandbox Code Playgroud)
我观看了Derek Banas的shell脚本编写教程,并在视频的41:00获得了上述语法
https://www.youtube.com/watch?v=hwrnmQumtPw&t=73s
上面的代码在我们分配数字时起作用resVar
,但是如果我尝试分配一个字符串resVar
,它总是返回0.
(( numVar == numVal ? (resVar="Yop") : (resVar="Nop") ))
Run Code Online (Sandbox Code Playgroud)
并尝试过
resVar=$(( numVar == numVal ? (echo "Yop") : (echo "Nop") ))
Run Code Online (Sandbox Code Playgroud)
那么这是正确的方法呢?
您没有告诉我们您使用什么外壳,但您可能使用
bash
或类似的外壳。三元运算符Bash
仅适用于数字,如下man bash
节所述ARITHMETIC EVALUATION
:
shell 允许在某些情况下计算算术表达式(请参阅 let 和声明内置命令以及算术扩展)。尽管除以 0 会被捕获并标记为错误,但评估是在固定宽度整数中完成的,不检查溢出。运算符及其优先级、结合性和值与 C 语言中的相同。以下运算符列表按同等优先级运算符分组。级别按优先级递减的顺序列出。
(...)表达式?表达式:表达式
条件运算符
当您使用or
时resVar
分配的原因是因为这样的字符串不是有效的数字,因此它被评估为。同一段中也对此进行了解释:0
"Yop"
"Nop"
bash
0
man bash
空值的计算结果为 0。
如果您觉得这篇维基百科文章更容易阅读,它也对此进行了解释:
真正的三元运算符仅存在于算术表达式中:
((结果 = 条件? value_if_true : value_if_false))
对于字符串,仅存在解决方法,例如:
结果=$([ "$a" == "$b" ] && echo "value_if_true" || echo "value_if_false")
(其中“$a”==“$b”可以是任何条件测试,各自的[,可以评估。)