用于获取字符串结果的Shell脚本三元运算符

9rbhqvlz  于 2023-02-24  发布在  Shell
关注(0)|答案(4)|浏览(240)

在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") ))

那么,哪种方法才是正确的呢?

csga3l58

csga3l581#

您没有告诉我们您使用的是什么shell,但您可能使用bash或类似的shell。Bash中的三元运算符仅适用于数字,如man bashARITHMETIC EVALUATION部分所述:
在某些情况下,shell允许计算算术表达式(参见let和declare内置命令和算术扩展)。计算是在固定宽度的整数中完成的,不检查溢出,尽管除以0会被捕获并标记为错误。运算符及其优先级、结合性、和值与C语言中的相同。下面的运算符列表按优先级相等的运算符级别分组。这些级别按优先级降序列出。
(...)
表达式?表达式:表达式
条件算子
当你使用"Yop""Nop"时,resVar被赋值为0的原因是这样的字符串在bash中不是一个有效的数字,因此它被赋值为0,在同一段的man bash中也有解释:
空值计算为0。
如果你觉得这篇维基百科文章更容易阅读,它也会解释:
真正的三元运算符只存在于算术表达式中:
((结果=条件?值如果为真:值_如果_为假))
对于字符串,仅存在变通方法,例如:
结果=$(["$a"=="$b"]&&回显"如果为真,则返回值"||回显"如果值为假")
(其中"$a"=="$b"可以是任何条件测试,相应的[,可以求值。)

kdfy810k

kdfy810k2#

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

u2nhd7ah3#

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

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

7kqas0il4#

运行Gohti的想法,使脚本更可读:

#!/bin/bash 
declare -a resp='([0]="not safe" [1]="safe")'

temp=70; ok=$(( $temp > 60 ? 1 : 0 ))
printf "The temperature is $temp Fahrenheit, it is ${resp[$ok]} to go outside\n";

temp=20; ok=$(( $temp > 60 ? 1 : 0 ))
printf "The temperature is $temp Fahrenheit, it is ${resp[$ok]} to go outside\n";

相关问题