У меня проблема с обновлением значения переменной в скрипте оболочки из цикла while. Это можно смоделировать с помощью следующего фрагмента кода:
printf "aaa\nbbb\n" | \
while read x ; do
y=$x
echo "INSIDE: $y"
done
echo "OUTSIDE: $y"
Выход:
INSIDE: aaa
INSIDE: bbb
OUTSIDE:
Здесь команда printf просто отображает две строки, в то время как цикл чтения читает построчно, обновляя определенную переменную, но как только управление выходит из цикла, значение переменной теряется.
Я полагаю, что проблема связана с тем фактом, что оператор pipe-while-read заставляет shell выполнять тело цикла в подпроцессе, который не может обновить переменные оболочки в основном цикле.
Если я перепишу первые две строки кода как
for x in `printf "aaa\nbbb\n" ` ; do
Выход:
INSIDE: aaa
INSIDE: bbb
OUTSIDE: bbb
Это может быть обходной путь, но не для моего случая, потому что на самом деле у меня есть не 'aaa' и 'bbb', а более сложные строки, включая пробелы и т. Д.
Есть идеи, как решить эту проблему, а именно: читать строку команды за строкой в цикле и иметь возможность обновлять переменные оболочки?
Спасибо.