【问题标题】:Nested default arguments in bash?bash中的嵌套默认参数?
【发布时间】: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


【解决方案1】:

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

${参数:-word}

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

左边是参数而不是解引用值

【讨论】:

  • 哇!以前没有尝试过,我觉得太愚蠢了。非常感谢!
【解决方案2】:

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

最好将你的逻辑分解成几个语句,然后添加 cmets。

【讨论】:

  • 或者使用 Nathan 的绝妙解决方案,哈哈——但仍然为在六个月后出现在你身后的可怜人添加 cmets 来维护它(在我的情况下通常是我)。 ;)
  • 也谢谢。你实际上给出了相同的答案,但内森的答案是第一位的,而且更短。关于维护,我在代码中添加了:# how to read this: https://stackoverflow.com/a/55851899/519536。但是,一旦您了解了参数扩展,我发现它非常不言自明。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-06-07
  • 2016-08-21
  • 2018-11-03
  • 1970-01-01
  • 1970-01-01
  • 2015-07-27
  • 2014-03-09
相关资源
最近更新 更多