#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