Правильная запись для подстановки процесса :
while read i; do echo $i; done < <(echo "$FILECONTENT")
Последнее значение, i
присвоенное в цикле, становится доступным, когда цикл завершается. Альтернатива:
echo $FILECONTENT |
{
while read i; do echo $i; done
...do other things using $i here...
}
Фигурные скобки представляют собой операцию группирования ввода-вывода и сами по себе не создают подоболочку. В этом контексте они являются частью конвейера и поэтому выполняются как подоболочка, но это из-за того |
, что , а не из-за { ... }
. Вы упомянули об этом в вопросе. AFAIK, вы можете сделать возврат из них внутри функции.
Bash также предоставляет shopt
встроенную функцию, и один из многих ее вариантов:
lastpipe
Если установлено, а управление заданиями неактивно, оболочка выполняет последнюю команду конвейера, которая не выполняется в фоновом режиме в текущей среде оболочки.
Таким образом, использование в скрипте чего-то вроде этого делает модифицируемый sum
доступным после цикла:
FILECONTENT="12 Name
13 Number
14 Information"
shopt -s lastpipe
sum=0
echo "$FILECONTENT" |
while read number name; do ((sum+=$number)); done
echo $sum
Выполнение этого в командной строке обычно приводит к фолу «управление заданиями неактивно» (то есть в командной строке активно управление заданиями). Проверить это без использования сценария не удалось.
Кроме того, как отметил Гарет Рис в своем ответе , иногда вы можете использовать здесь строку :
while read i; do echo $i; done <<< "$FILECONTENT"
Это не требует shopt
; вы можете сохранить процесс, используя его.