"x = (x - 1) unless (x - 1 == 0) in which case y"的 Bash 表达式

标签 bash

我想递减变量“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/

相关文章:

linux - Bash 脚本 : keep one line of local file in sync with remote file

bash - shell 更新后在 .bashrc 中找不到 shopt 命令

c - 通过管道将 C 程序输入传递给 system() 函数 fuinput

linux - 当您使用 "npm install -g"安装节点模块时,npm 将全局安装的文件放在哪里?

linux - 更好的解析输入的方法

Linux 导出命令语法

linux - 如何在 shell 脚本中使用 curl?

linux - 将 Git 添加到/bin/bash

bash - 用于抓取数据并进行减法的 shell 脚本

linux - 使 linux SPLIT 命令与 Mac OS 终端兼容