bash при чтении аргументов цикла из переменной выпуска - PullRequest
0 голосов
/ 18 октября 2018

У меня есть скрипт bash со следующей переменной:

operators_list=$'andrii,bogdan,eios,fre,kuz,pvm,sebastian,tester,tester2,vincent,ykosogon'

while IFS=, read -r tech_login; do


    echo "... $tech_login ..."

done <<< "$operators_list"

Мне нужно прочитать аргументы из переменной и работать с ними в цикле.Но он возвращает эхо только один раз со всеми элементами:

+ IFS=,
+ read -r tech_login
+ echo '... andrii,bogdan,eios,fre,kuz,pvm,sebastian,tester,tester2,vincent,ykosogon ...'
... andrii,bogdan,eios,fre,kuz,pvm,sebastian,tester,tester2,vincent,ykosogon ...
+ IFS=,
+ read -r tech_login

Что я делаю не так?Как переработать скрипт, чтобы он работал только с одним элементом за раз?

1 Ответ

0 голосов
/ 18 октября 2018
operators_list=$'andrii,bogdan,eios,fre,kuz,pvm,sebastian,tester,tester2,vincent,ykosogon'

Итак, у вас есть строки, разделенные ,.Вы можете сделать это несколькими способами:

  1. , используя массивы bash:

IFS=, read -a operators <<<$operators_list
for op in "${operators[@]}"; do
    echo "$op"
done
Используя цикл while, как вы и хотели:

while IFS= read -d, -r op; do
    echo "$op"
done <<<$operators_list
Использование xargs, потому что почему бы и нет:

<<<$operators_list xargs -d, -n1 echo

В случае IFS и считывателя delimeter: read читает до тех пор, пока в качестве разделителя не будет указано -d.Затем после того, как read прочитал полную строку (обычно целую строку, поскольку разделителем по умолчанию является символ новой строки), затем строка разбивается на части, используя IFS в качестве разделителя.Так что вы можете:

while IFS=: read -d, -r op1 op2; do
    echo "$op1" "$op2"
done <<<"op11:op12,op12:op22"
...