我正在写一个 bash 脚本。
每这个原始帖子我了解到,如果 var未设置或为空,c=${a:-b}
则可用于设置变量。c
a
我想知道我们是否可以将这种情况扩展到将命令的输出分配给变量。例如,我有一个 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 (或任何可以处理(而不是修改)非文本输入,并且不忽略非分隔行的实现),您可以执行以下操作:default
cmd
grep
var=$(cmd | grep '^') || var=default
grep '^'
如果 where 在其输入中找到至少一行的开头(并将其整个输入不受干扰地传递到其输出),则返回 true。
在这种情况下,cmd
的退出状态将丢失。如果仅输出 NUL 或换行符,则$var
最终可能为空。cmd