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

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)

那么这是正确的方法呢?

Ark*_*zyk 4

您没有告诉我们您使用什么外壳,但您可能使用 bash或类似的外壳。三元运算符Bash仅适用于数字,如下man bash节所述ARITHMETIC EVALUATION

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

表达式?表达式:表达式

条件运算符

当您使用or 时resVar分配的原因是因为这样的字符串不是有效的数字,因此它被评估为。同一段中也对此进行了解释:0"Yop""Nop"bash0man bash

空值的计算结果为 0。

如果您觉得这篇维基百科文章更容易阅读,它也对此进行了解释:

真正的三元运算符仅存在于算术表达式中:

((结果 = 条件? value_if_true : value_if_false))

对于字符串,仅存在解决方法,例如:

结果=$([ "$a" == "$b" ] && echo "value_if_true" || echo "value_if_false")

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