我们可以在冒号后面使用 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