【发布时间】:2019-04-25 14:13:25
【问题描述】:
是否可以在 bash 中进行嵌套参数扩展? (例如:VAR=${{1:-$ENV_VAR}:-hard-coded default})
我想用默认值设置命令行参数。但是,在使用硬编码默认值之前,我想检查环境变量。因此,预期的顺序将是(例如):
$1 -> $ENV_VAR -> "hard-coded default"
我可以通过两种方式解决这个问题(见下文),但看起来都很糟糕:
1:
VAR=${1:-$ENV_VAR}
VAR=${VAR:-hard-coded default}
2:
VAR2=$([ -n "${1:-$ENV_VAR}" ] && echo "${1:-$ENV_VAR}" || echo "hard-coded default")
小例子:
$ cat test.sh
#!/bin/bash
VAR=${1:-$ENV_VAR}
VAR=${VAR:-hard-coded default}
VAR2=$([ -n "${1:-$ENV_VAR}" ] && echo "${1:-$ENV_VAR}" || echo "hard-coded default")
echo ENV_VAR is "'$ENV_VAR'"
echo VAR is "'$VAR'"
echo VAR2 is "'$VAR2'"
$ ./test.sh
ENV_VAR is ''
VAR is 'hard-coded default'
VAR2 is 'hard-coded default'
$ env ENV_VAR=test ./test.sh
ENV_VAR is 'test'
VAR is 'test'
VAR2 is 'test'
$ ./test.sh parameter
ENV_VAR is ''
VAR is 'parameter'
VAR2 is 'parameter'
$ env ENV_VAR=test ./test.sh parameter
ENV_VAR is 'test'
VAR is 'parameter'
VAR2 is 'parameter'
【问题讨论】:
-
那么这里的问题是什么?看来你已经想通了?
-
是否可以进行嵌套扩展(类似
VAR=${{1:-$ENV_VAR}:-hard-coded default})。 -
bash 不支持像上面那样的嵌套扩展,
zsh我能猜到吗 -
在这种特殊情况下应该可以使用
VAR=${1:-${ENV_VAR:-hardcoded}} -
手册中实际上有一个例子(在
fc下),对于正在使用的编辑器:“如果没有给出ename,则值使用以下变量扩展中的一个:${FCEDIT:-${EDITOR:-vi}}。"
标签: linux bash parameter-passing variable-expansion