在shell脚本中,我使用的三元运算符如下所示:
(( numVar == numVal ? (resVar=1) : (resVar=0) ))
我看了DerekBanas的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") ))
那么,哪种方法才是正确的呢?
4条答案
按热度按时间csga3l581#
您没有告诉我们您使用的是什么shell,但您可能使用
bash
或类似的shell。Bash
中的三元运算符仅适用于数字,如man bash
中ARITHMETIC EVALUATION
部分所述:在某些情况下,shell允许计算算术表达式(参见let和declare内置命令和算术扩展)。计算是在固定宽度的整数中完成的,不检查溢出,尽管除以0会被捕获并标记为错误。运算符及其优先级、结合性、和值与C语言中的相同。下面的运算符列表按优先级相等的运算符级别分组。这些级别按优先级降序列出。
(...)
表达式?表达式:表达式
条件算子
当你使用
"Yop"
或"Nop"
时,resVar
被赋值为0
的原因是这样的字符串在bash
中不是一个有效的数字,因此它被赋值为0
,在同一段的man bash
中也有解释:空值计算为0。
如果你觉得这篇维基百科文章更容易阅读,它也会解释:
真正的三元运算符只存在于算术表达式中:
((结果=条件?值如果为真:值_如果_为假))
对于字符串,仅存在变通方法,例如:
结果=$(["$a"=="$b"]&&回显"如果为真,则返回值"||回显"如果值为假")
(其中"$a"=="$b"可以是任何条件测试,相应的[,可以求值。)
kdfy810k2#
Arkadiusz已经指出三元运算符是bash中的一个算术特性,不能用在字符串中,如果你想要字符串中的这种功能,你总是可以使用数组:
当然,如果你只是处理两个值,它们可以在你的数组中的位置
0
和1
,你不需要三进制;以下实现相同的事情:u2nhd7ah3#
你可以用这个简单的表达式:
7kqas0il4#
运行Gohti的想法,使脚本更可读: