Shell Scripting Ternary运算符获取字符串结果
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Shell Scripting Ternary运算符获取字符串结果相关的知识,希望对你有一定的参考价值。
在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") ))
那么这是正确的方法呢?
您没有告诉我们您使用的是什么外壳,但您可以使用bash
或类似的东西。 Bash
中的三元运算符仅适用于man bash
部分ARITHMETIC EVALUATION
中解释的数字:
在某些情况下,shell允许计算算术表达式(参见let和declare builtin命令和算术扩展)。评估是在固定宽度的整数中完成的,没有检查溢出,但除以0被捕获并标记为错误。运算符及其优先级,关联性和值与C语言中的相同。以下运算符列表分组为等优先运算符的级别。级别按优先级递减的顺序列出。 (......)
EXPR EXPR:EXPR
条件运算符
当你使用resVar
或0
时,"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”可以是任何条件测试,各自[,可以评估。)
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
当然,如果你只处理数组中位于0
和1
位置的两个值,你就不需要三元数;以下内容实现了同样的目的:
$ resvar="${arr[$((numVar==numVal))]}"
你可以使用这个简单的表达式:
resVar=$([ numVar == numVal ] && echo "Yop" || echo "Nop")
以上是关于Shell Scripting Ternary运算符获取字符串结果的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Shell Scripting 中检查目录是不是为空? [复制]
439. Ternary Expression Parser
LeetCode Ternary Expression Parser