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 в подоболочке? (и как это сделать?) Спасибо