我想递减变量“x”,但如果递减 x 产生 0,我想将哨兵值(说“你好”)存储到 x 中。
我可以用两个表达式来做到这一点:
x=$((x - 1))
[[ "$x" -eq "0" ]] && x=hello
是否有一种优雅的单行代码可以做到这一点?我一直在尝试数学评估和三元运算符,但是
x=1
echo $((x-1 == 0 ? "hello" : x-1))
永远不会打印hello
,它只是打印0
。
最佳答案
您可以使用(( ))
来评估其内容是否非零,如果不是,您可以有条件地执行命令:
$ x=1
$ (( --x )) || x='hello'
$ echo "$x"
hello
如果内部表达式计算结果为非零,(( ))
计算结果为 true(退出状态 0):
(( 1 ))
为 true(( 0 ))
为 false
x
为 1,(( --x ))
为 false。
如果三元运算符确实可以同时处理字符串和数字,则也可以写为
(( x = x-1 ? x-1 : 'hello' ))
但是字符串在 Bash 的算术上下文中计算结果为 0。
关于 "x = (x - 1) unless (x - 1 == 0) in which case y"的 Bash 表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49133092/