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

时间:2018-03-06 14:24:32

标签: bash

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

1 个答案:

答案 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。