Вы можете использовать здесь документ:
while IFS= read -r SINGLELINE
do
SOMEVAR="updated value"
printf '%s\n' "this is a single line: ${SINGLELINE}"
printf '%s\n' "SOMEVAR is now: ${SOMEVAR}"
done << EOF
$MULTILINE
EOF
printf '%s\n' "Final SOMEVAL is still $SOMEVAR"
В зависимости от реализации sh
, здесь -документы реализованы либо как удаленный временный файл, в котором оболочка заранее сохранила расширение переменной, за которым следует перевод строки, либо как канал, в который оболочка передает расширение переменная, за которой следует новая строка. Но в любом случае, за исключением оригинальной оболочки Bourne (, которая больше не используется в наши дни и не является POSIX-совместимой оболочкой ), перенаправляемая команда не выполняется в подоболочке (, как POSIX. требует ).
или вы можете использовать split+glob:
IFS='
' # split on newline only
set -o noglob
for SINGLELINE in $MULTILINE
do
SOMEVAR="updated value"
printf '%s\n' "this is a single line: ${SINGLELINE}"
printf '%s\n' "SOMEVAR is now: ${SOMEVAR}"
done
printf '%s\n' "Final SOMEVAL is still $SOMEVAR"
Но будьте осторожны, он пропускает пустые строки.