Ответ 1
Цикл for
не предназначен для зацикливания "строк". Вместо этого он зацикливается на "слова" или "поля".
Идиоматичен способом цикла по линии является использование while
цикла в сочетании с read
.
ioscan -m dsf | while read -r line
do
printf '%s\n' "$line"
done
Обратите внимание, что цикл while находится в подоболочке из-за конвейера. Это может вызвать некоторую путаницу с переменной областью действия. В bash вы можете обойти это, используя подстановку процессов.
while read -r line
do
printf '%s\n' "$line"
done < <(ioscan -m dsf)
см. также http://mywiki.wooledge.org/BashFAQ/024
Цикл for разделяет значения для циклического использования символов в переменной $IFS
(внутренний разделитель полей) в качестве разделителей. Обычно $IFS
содержит пробел, табуляцию и символ новой строки. Это означает, что цикл for
будет зацикливаться на "словах", а не на строках.
Если вы настаиваете на использовании цикла for для циклического перебора строк, вы должны изменить значение $IFS
только на новую строку. Но если вы сделаете это, вы должны сохранить старое значение $IFS
и восстановить его после цикла, потому что многие другие вещи также зависят от $IFS
.
OLDIFS="$IFS"
IFS=$'\n' # bash specific
for line in $(ioscan -m dsf)
do
printf '%s\n' "$line"
done
IFS="$OLDIFS"
в оболочках POSIX, которые не имеют кавычек ANSI-C ($'\n'
), вы можете сделать это следующим образом:
IFS='
'
то есть: поставить новую строку между кавычками.
В качестве альтернативы вы можете использовать подоболочку для хранения изменения $IFS
:
(
# changes to variables in the subshell stay in the subshell
IFS=$'\n'
for line in $(ioscan -m dsf)
do
printf '%s\n' "$line"
done
)
# $IFS is not changed outside of the subshell
Но будьте осторожны, команда в цикле может сама по себе зависеть от некоторых нормальных настроек для $IFS
. Затем вы должны восстановить $IFS
перед выполнением команды и установить снова перед следующим циклом или чем-то подобным. Я не рекомендую возиться с $IFS
. Слишком много команд зависят от некоторых нормальных значений в $IFS
и их изменение - это бесконечный кошмар неясной охоты за ошибками.
Смотрите также: