bash 中的嵌套默认参数?
Nested default arguments in bash?
是否可以在bash中进行嵌套参数扩展? (例如:VAR=${{1:-$ENV_VAR}:-hard-coded default}
)
我想用默认值设置命令行参数。但是,在使用硬编码默认值之前,我想检查一个环境变量。因此,预期的顺序将是(例如):
-> $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:-hardcoded}}
(:-
的右侧)文档:
${parameter:-word}
If parameter is unset or null, the expansion of word is substituted. Otherwise, the value of parameter is substituted.
左边是一个参数,不是解除引用的值
bash 中的参数扩展支持扩展修饰符右轴的参数计算,但默认情况下不支持左轴。
$: 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
最好将您的逻辑分解成几个语句,然后添加注释。
是否可以在bash中进行嵌套参数扩展? (例如:VAR=${{1:-$ENV_VAR}:-hard-coded default}
)
我想用默认值设置命令行参数。但是,在使用硬编码默认值之前,我想检查一个环境变量。因此,预期的顺序将是(例如):
-> $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:-hardcoded}}
(:-
的右侧)文档:
${parameter:-word}
If parameter is unset or null, the expansion of word is substituted. Otherwise, the value of parameter is substituted.
左边是一个参数,不是解除引用的值
bash 中的参数扩展支持扩展修饰符右轴的参数计算,但默认情况下不支持左轴。
$: 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
最好将您的逻辑分解成几个语句,然后添加注释。