Сценарий Unix перебирает отдельные переменные в списке и выполняет код

#string #bash #loops #variables #unix

#строка #bash #циклы #переменные #unix

Вопрос:

Я весь день ломал голову, не находя успешного решения.

Настройка: у нас есть Linux RHEL 8.3 и файл, script.sh

В приложении задана переменная среды с динамической строкой в ней.

 export PROGARM_VAR="abc10,def20,ghi30"
 

Разделителем всегда является «,», а значения внутри варьируются от 1 до 20.

Внутри скрипта я определил 20 переменных, которые принимают значения

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

   var1=$(echo $PROGARM_VAR | cut -f1 -d,) 
  var2=$(echo $PROGARM_VAR | cut -f2 -d,)  
  var3=$(echo $PROGARM_VAR | cut -f3 -d,)  
  var4=$(echo $PROGARM_VAR | cut -f4 -d,)
  etc
 

В нашем случае мы будем иметь:

 var1="abc10" var2="def20" var3="ghi30" and var4="" which is empty
 

Цикл должен принимать каждую переменную, проверять, не пуста ли она, и выполнять 10 страниц кода с использованием тестируемой переменной. Когда он достигает пустой переменной, он должен прерваться.

Не могли бы вы мне помочь, пожалуйста? Спасибо

Ответ №1:

Просто разделите его запятой. Есть бесконечные возможности. Вы могли бы:

 10_pages_of_code() { echo "$1"; }
IFS=, read -a -r vars <<<"abc10,def20,ghi30"
for i in "${vars[@]}"; do 10_pages_of_code "$i"; done
 

или:

 printf "%s" "abc10,def20,ghi30" | xargs -n1 -d, bash -c 'echo 10_pages_of_code "$1"' _
 

readarray Вместо read правильной обработки новых строк в значениях можно использовать более безопасный код, но я сомневаюсь, что это имеет значение для вас:

 IFS= readarray -d , -t vars < <(printf "%s" "abc10,def20,ghi30")
 

Вы также можете читать в потоке вверх:

 while IFS= read -r -d, var || [[ -n "$var" ]]; do
        10_pages_of_code "$var"
done < <(printf "%s" "abc10,def20,ghi30")
 

Но все же вы могли бы сделать это с помощью cut … просто напишите цикл и используйте итератор.

 i=0
while var=$(printf "%sn" "$PROGARM_VAR" | cut -f"$i" -d,) amp;amp; [[ -n "$var" ]]; do
      10_pages_of_code "$var"
      ((i  ))
done
 

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

1. Спасибо, высоко ценится

Ответ №2:

или

 echo "$PROGRAM_VAR" | tr , \n | while read var; do
   : something with $var
done