igorp1024 15.02.2010 13:12
Tips & tricks — IFS, Пробелы и однострочники
Проблему с обработкой имён файлов, содержащих пробелы, часто предлагается решать с помощью замены for на while/read.Это можно проще - через переменную IFS, определив её значение как
1 |
|
Пример однострочника:
1 |
IFS=$'\n'; for F in `echo "hellow orld #1"; echo; echo "hellow orld #2"`; do echo \>\>"$F"\<\< ; done
|
Вывод:
>>hellow orld #1<<
>>hellow orld #2<<
>>hellow orld #2<<
Поиском статей с данным советом не нашёл. Изредка упоминается да и то только в тексте двух скриптов и одном комменте (и то вскользь).
imurzich 15.02.2010 13:48 #
+ 0 -
Вот чуть более развёрнутое упоминание использования IFS - Using the Bash IFS variable to make for loops split with non whitespace characters
Не согласен. :)
Там в качестве примера предлагается использовать запятую. Причём, парсится строка уже разделённая запятыми. В моём же примере - это перевод строки, генерируемый той же ls, например.
Цель постига - показать, как легко решить проблему с пробелами в однострочниках.
Там в качестве примера предлагается использовать запятую. Причём, парсится строка уже разделённая запятыми. В моём же примере - это перевод строки, генерируемый той же ls, например.
Цель постига - показать, как легко решить проблему с пробелами в однострочниках.
Если люди лишены абстрактного мышления и не способны заменить запятую из примера на перевод строки то им уже мало что поможет. Добавлю свои пять копеек:
в таком варианте замена IFS произойдёт локально и по выходу из скобок разделитель будет прежний.
( IFS=$'\n'; for F in `echo "hellow orld #1"; echo; echo "hellow orld #2"`; do echo \>\>"$F"\<\< ; done )
в таком варианте замена IFS произойдёт локально и по выходу из скобок разделитель будет прежний.
Если люди лишены абстрактного мышления и не способны заменить запятую из примера
Оки, согласен. Просто хотел сказать, что пример в статье искуственнен и оторван от жизни. Я хотел показать, как починить все однострочники, а не рассказать о IFS. :)
Ну так кто бы спорил. Просто у IFS может быть и иное применение: он может запросто заменить cut для превращения списка из непригодного в пригодный для bash вид. Например вместо:
for path in $(echo $PATH|cut -d ':'); do ls $path; done
можно написать:( IFS=":"; for path in $PATH; do ls $path; done )
Сложно починить однострочник с помощью использования IFS без знания, что же такое этот IFS...
Будем считать, что это рецепт из серии: "Скорее всего, Вам нужно именно это..." :)