我想减少一个变量'x',但是如果递减x得0,我想把一个sentinel值(比如'hello')存储到x中。
我可以用两个表达式来做到这一点:
x=$((x - 1))
[[ "$x" -eq "0" ]] && x=hello
这是否有优雅的单行程?我一直在尝试数学评估和三元运算符,但
x=1
echo $((x-1 == 0 ? "hello" : x-1))
不打印hello
,只打印0
。
答案 0 :(得分:3)
您可以使用(( ))
来评估其内容是否为非零,如果不是,则可以有条件地执行命令:
$ x=1
$ (( --x )) || x='hello'
$ echo "$x"
hello
如果内部表达式求值为非零,则 (( ))
被计算为true(退出状态0):
(( 1 ))
是真的(( 0 ))
是假的(( --x ))
为1,则 x
为false。
如果三元运算符确实使用了字符串和数字,那么这也可以写成
(( x = x-1 ? x-1 : 'hello' ))
但字符串在Bash的算术上下文中计算为0。