shell - temp IFS только как перевод строки. Почему это не работает: IFS = $ (echo -e '\ n')
я пытаюсь использоватьfor
в оболочке для перебора имен файлов с пробелами. Я читаю вstackoverflow вопрос IFS=$'\n'
может быть использован, и это, кажется, работает нормально. Я тогда читаюв комментарии к одному из ответов чтобы сделать его совместимым с posix для других оболочек, кроме bash, которые можно использовать.IFS=$(echo -e '\n')
Первый работает, а второй нетт. За комментарий проголосовали несколько раз. Я проверил вывод и переменная неКажется, он содержит новую строку.
#!/bin/sh
IFS=$(echo -e '\n')
echo -n "$IFS" | od -t x1
for file in `printf 'one\ntwo two\nthree'`; do
echo "Found $file"
done
echo
IFS=
Выходные данные показывают, что разделитель полей отсутствует для первого:
0000000
Found one
two two
three
Но уместно на втором:
0000000 0a
0000001
Found one
Found two two
Found three
Я нашел ответ на вопрос, который может или не может быть дубликатом моего вопроса:
Linux - при настройке IFS для разделения на новые строки, почему необходимо включить возврат? - Переполнение стека
Есть ли опасность делать что?обсуждали там,IFS=$(echo -en '\n\b')
? Потому что это добавляет\b
на IFS (я проверял). Может\b
встречаться в имени файла? Я неЯ не хочу, чтобы мой код разделил имя файла по ошибке.
Также есть ли у вас какие-либо рекомендации о том, как правильно обращаться с восстановлением IFS послеfor
цикл? Должен ли я хранить его во временной переменной или запустить IFS и оператор for в подоболочке? (и как это сделать?) Спасибо
\n'
echo -n "$IFS" | od -t x1
for file in `printf 'one\ntwo two\nthree'`; do
echo "Found $file"
done
Выходные данные показывают, что разделитель полей отсутствует для первого:
0000000
Found one
two two
three
Но уместно на втором:
0000000 0a
0000001
Found one
Found two two
Found three
Я нашел ответ на вопрос, который может или не может быть дубликатом моего вопроса:
Linux - при настройке IFS для разделения на новые строки, почему необходимо включить возврат? - Переполнение стека
Есть ли опасность делать что?обсуждали там,IFS=$(echo -en '\n\b')
? Потому что это добавляет\b
на IFS (я проверял). Может\b
встречаться в имени файла? Я неЯ не хочу, чтобы мой код разделил имя файла по ошибке.
Также есть ли у вас какие-либо рекомендации о том, как правильно обращаться с восстановлением IFS послеfor
цикл? Должен ли я хранить его во временной переменной или запустить IFS и оператор for в подоболочке? (и как это сделать?) Спасибо