ASH/BASH в альпийском: как развернуть переменную из списка имен переменных, прочитанных из файла списка

#bash #shell #alpine #ash

Вопрос:

Я пытался найти способ расширить переменную из строки (имя переменной), прочитанной из списка в файле.

Цель здесь состоит в том, чтобы оценить, присутствуют ли все переменные в конвейере gitlab, если нет, завершите конвейер.

Наилучшим возможным решением было бы иметь это в качестве однострочного и работающего из пепельной оболочки Alpine, но «что-то» bash-c также может сделать.

Очевидно, что есть проблема с (!) символом расширения, так как varcontent всегда пуст, но я просто не могу понять, что я делаю не так.

 alpine314:~# cat checkvars.sh #!/bin/bash false=false while read -r line; do  varcontent=${!line}  if [ -z "$varcontent" ]; then  echo "Error: Missing a required pipeline variable."  false=true  exit 1  else  echo "$line: $varcontent"  fi done lt; $1 alpine314:~# cat varsfile VAR1 VAR2 VAR3 alpine314:~# echo $VAR1 1 alpine314:~# echo $VAR2 2 alpine314:~# echo $VAR3  alpine314:~# bash -x checkvars.sh varsfile   false=false   read -r line   varcontent=   '[' -z '' ']'   echo 'Error: Missing a required pipeline variable.' Error: Missing a required pipeline variable.   false=true   exit 1 alpine314:~#  

Желаемое поведение здесь-выйти из сценария с ошибкой в случае, если какая-либо из переменных пуста/не задана.

Ура!

Комментарии:

1. Вам нужно экспортировать переменные, чтобы они были видны в оболочке, которая выполняет сценарий.

2. Либо эш, либо баш. Вы собираетесь использовать bash или ash?

Ответ №1:

что я делаю не так.

Ваши переменные не экспортируются. Выполните следующие действия перед запуском сценария.

 export VAR1 VAR2 VAR3  

Проверьте свои сценарии с помощью shellcheck. false=true — было бы лучше использовать другое имя переменной…