Bash 的条件运算符和赋值

Bash 的条件运算符和赋值

我们可以在冒号后面使用 bash 的条件运算符和赋值运算符吗?

Bash 参考手册算术运算符解释如下。

  • 条件运算符expr ? expr : expr
  • 任务= *= /= %= += -= <<= >>= &= ^= |=

首先,这段代码似乎运行良好:

a=1; ((a? b=1 : 2 )) #seems to work

但是当我在之后使用赋值运算符时:,出现“尝试赋值给非变量”错误:

a=1; ((a? b=1 : c=1)) #attempted assignment to non-variable error

为什么冒号前只能使用赋值运算符?

答案1

Bash 将你的最后一个命令解析为

a=1; (( (a? b=1 : c)=1 ))

这应该清楚为什么它不起作用。相反,你必须使用

a=1; (( a? b=1 : (c=1) ))

答案2

这称为ternary assignment表达式。这是我另一个回答的一点内容:

% a=abc
% b=abcd
% t=10 ; f=5
% echo $((r=${#a}>${#b}?t:f)) ; echo $r
> 5 
> 5
% echo $((r=${#a}<${#b}?t:f)) ; echo $r
> 10
> 10

你看,正如你所说,这是一个有条件的赋值操作。这取决于条件。语法如下:

$((var = $condition <compare_operator> $condition \
    ?if $true_assign :or $false_assign ))

我不相信你没有正确使用这个。

维基百科:

?:使用如下:

condition ? value_if_true : value_if_false

条件以布尔表达式的形式评估 true 或 false。根据布尔条件的评估,如果条件为 true,则整个表达式返回 value_if_true,否则返回 value_if_false。通常两个子表达式 value_if_true 和 value_if_false 必须具有相同的类型,这决定了整个表达式的类型。这种类型检查的重要性在于运算符最常见的用途 - 在条件赋值语句中。在此用法中,它显示为赋值语句右侧的表达式,如下所示:

variable = condition ? value_if_true : value_if_false

?:运算符类似于if-then-else函数式编程语言(如Scheme、ML 和Haskell)中条件表达式(构造)的工作方式,因为if-then-else 在这些语言中形成表达式而不是语句。

我认为你的具体问题与此相关:

与 if-else 构造一样,仅计算表达式“x”和“y”之一。

如果您阅读上面有关表达式的链接,ternary您会发现评估是短路的,因此您对错误的边错误是因为1 = true.

无论如何,这并不重要,因为我认为这并不像你想象的那样。

答案3

三元运算符返回基于测试的值。它们不用于分支。

这是为 bash 获取伪三元运算符的一种方法(注意反引号):

$result=`[ < condition > ] && echo "true-result" || echo "false-result" `

$ a= $ c=`[ $a ] && echo 1 || echo 0` $ echo $c 0 $ a=5 $ c=`[ $a ] && echo 1 || echo 0` $ echo $c 1

相关内容