在bash中嵌套默认参数?

时间:2019-04-25 14:13:25

标签: linux bash parameter-passing variable-expansion

是否可以在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'

2 个答案:

答案 0 :(得分:2)

在这种特殊情况下,应该可以使用VAR=${1:-${ENV_VAR:-hardcoded}}:-的右侧)文档:

  

$ {parameter:-word}

     

如果参数未设置或为null,则替换单词的扩展。否则,将替换参数的值。

左侧是参数,而不是取消引用的值

答案 1 :(得分:0)

bash中的参数扩展支持在扩展修饰符的RHS中进行参数评估,但默认情况下不支持LHS。

$: unset a; b=foo; echo "${a:-$b}"; echo "${$b}";
foo
bash: ${$b}: bad substitution

使用eval可以获得相似的结果

$: unset a; b=foo; foo=bar; echo "${a:=$b}"; eval "echo \${$a}";
foo
bar

最好将逻辑分解为多个语句,然后添加注释。