Вложенные по умолчанию аргументы в bash? - PullRequest
1 голос
/ 25 апреля 2019

Можно ли выполнить расширение вложенных параметров в 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 ]

2 голосов
/ 25 апреля 2019

в данном конкретном случае должно работать VAR=${1:-${ENV_VAR:-hardcoded}} (правая сторона :-) документация:

$ {параметр: -слово}

Если параметр не установлен или равен нулю, расширение слова заменяется. В противном случае значение параметра подставляется.

левая часть является параметром, а не разыменованным значением

0 голосов
/ 25 апреля 2019

Расширение параметров в 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

Возможно, лучше просто разбить свою логику на несколько утверждений и добавить комментарии.

...