我们可以在 bash 中使用“${a:-b}”进行变量赋值,并使用“a”命令吗?

我们可以在 bash 中使用“${a:-b}”进行变量赋值,并使用“a”命令吗?

我正在写一个 bash 脚本。

这个原始帖子我了解到,如果 var未设置或为空,c=${a:-b}则可用于设置变量。ca

我想知道我们是否可以将这种情况扩展到将命令的输出分配给变量。例如,我有一个 bash 命令,some command我可以将它分配给 varc

c=$(some command)

但我还想包括这样的情况:如果 的输出some command为空,我会为 c 指定另一个默认值。

我知道我可以if-else在 bash 脚本中编写普通的代码,但只是想知道是否有类似的更优雅的方式c=${a:-b}

答案1

在 zsh 中,您可以执行以下操作:

var=${$(cmd):-default}

但在包括 bash 在内的任何类似 POSIX 的 shell 中,您始终可以执行以下操作:

var=$(cmd)
var=${var:-default}

或者

: "${var:=default}"

您确实会丢失退出状态,但您可以将其保存在两个步骤之间的变量中:

var=$(cmd)
exit_status=$?
: "${var:=default}"

您还可以执行以下操作:

var=$(cmd) exit_status=$? || var=default

For$var被设置为default如果cmd失败(无论是否输出某些内容)。

请注意,如果cmd输出非空但仅包含换行符,则 after var=$(cmd),$var仍将作为命令替换条为空全部尾随换行符。bash还删除所有 NUL 字符。zsh保留它们,其他一些 shell 会删除第一个 NUL 字符之后的所有内容。yash因无法在语言环境中形成有效字符的字节序列而阻塞。

要仅在 的输出非空时$var设置为,使用 GNU (或任何可以处理(而不是修改)非文本输入,并且不忽略非分隔行的实现),您可以执行以下操作:defaultcmdgrep

var=$(cmd | grep '^') || var=default

grep '^'如果 where 在其输入中找到至少一行的开头(并将其整个输入不受干扰地传递到其输出),则返回 true。

在这种情况下,cmd的退出状态将丢失。如果仅输出 NUL 或换行符,则$var最终可能为空。cmd

相关内容