Bash表达式为“x =(x - 1),除非(x - 1 == 0),在这种情况下为y”

问题描述 投票:2回答:1

我想减少一个变量'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

bash
1个回答
3
投票

您可以使用(( ))来评估其内容是否为非零,如果不是,则可以有条件地执行命令:

$ x=1
$ (( --x )) || x='hello'
$ echo "$x"
hello

如果内部表达式求值为非零,则(( ))被计算为true(退出状态0):

  • (( 1 ))是真的
  • (( 0 ))是假的

如果在评估之前(( --x ))为1,则x是假的。

如果三元运算符确实使用了字符串和数字,那么这也可以写成

(( x = x-1 ? x-1 : 'hello' ))

但是字符串在Bash的算术上下文中计算为0。

© www.soinside.com 2019 - 2024. All rights reserved.