![bash 单行:将变量设置为命令的输出或如果输出为空则设置为默认值](https://linux22.com/image/99390/bash%20%E5%8D%95%E8%A1%8C%EF%BC%9A%E5%B0%86%E5%8F%98%E9%87%8F%E8%AE%BE%E7%BD%AE%E4%B8%BA%E5%91%BD%E4%BB%A4%E7%9A%84%E8%BE%93%E5%87%BA%E6%88%96%E5%A6%82%E6%9E%9C%E8%BE%93%E5%87%BA%E4%B8%BA%E7%A9%BA%E5%88%99%E8%AE%BE%E7%BD%AE%E4%B8%BA%E9%BB%98%E8%AE%A4%E5%80%BC.png)
我知道在 Bash 中你可以使用语法
editor=${new_editor:-/usr/bin/vi}
如果变量不为空,则设置editor
为,否则设置为。是否可以生成类似的单行代码,它将设置为某个命令的输出,如果输出为空,则设置为某个默认值?类似的东西(仅作为示例,这不起作用)new_editor
new_editor
/usr/bin/vi
editor
editor=$( $(which emacs) :-/usr/bin/vi )
我知道如何用几行代码来完成它,但想知道是否存在一个优雅的解决方案。
答案1
正面:
$ : "${editor:=$(command -v emacs)}" "${editor:=/usr/bin/vi}"
$ printf '%s\n' "$editor"
emacs
您不能在任何类似 Bourne 的 shell 中进行嵌套参数扩展,但是zsh
:
$ editor=${$(whence -p emacs):-/usr/bin/vi}
$ print -rl -- $editor
/usr/bin/emacs
或者:
editor=${commands[emacs]-$commands[vi]}