Что эквивалентно $ {! ENV} bash в sh? - PullRequest
0 голосов
/ 14 декабря 2018

Команда ${!ENV} в bash примет значение переменной окружения ENV, а затем интерпретирует это значение как имя другой переменной окружения, которое затем вернет значение сразу после.

ENV=PATH
echo ${!ENV}

Вывод:

/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin

В попытке сделать существующий конвейер Gitlab более лаконичным, я нашел применение этому поведению.Тем не менее, наш Gitlab Runner работает с sh, в отличие от bash.

Что эквивалентно bash ${!ENV} в sh?

1 Ответ

0 голосов
/ 14 декабря 2018

Нет.POSIX не требует такого «косвенного расширения» в оболочке.Лучшее, что вы можете сделать, это eval, если вы хотите быть строго POSIX-совместимым:

ENV=PATH
eval echo "\"$ENV is \$$ENV\""

Вывод (пример):

PATH is /usr/bin

По моему опыту, использование BashПрактически нигде нет проблем, поэтому вам также следует придерживаться Bash, если вы не педантично используете POSIX.

Помните, что eval опасно.Рекомендуется проверить, что строка безопасна для eval, перед тем, как на самом деле ее оценить, если строка не создана вами (вашим сценарием), а не каким-либо пользовательским вводом.Будет работать что-то простое:

echo "$ENV" | grep -qi '^[A-Z_][A-Z0-9_]*$'

Проверьте значение выхода $?.Если это ноль, тогда вы можете спокойно оценить $ENV.Если это 1, то вам лучше проверить строку более тщательно.

...