Я пытаюсь запустить for
цикл для файла, и я хочу, чтобы отобразить всю строку. Но вместо этого отображается только последнее слово. Я хочу полную линию.
for j in `cat ./file_wget_med`
do
echo $j
done
результат после запуска:
Found.
Вот мои данные:
$ cat file_wget_med
2013-09-11 14:27:03 ERROR 404: Not Found.
command-line
bash
scripts
user192118
источник
источник
Ответы:
for
Цикл разделяется, когда он видит любые пробелы, такие как пробел, табуляция или перевод строки. Итак, вы должны использовать IFS (Внутренний разделитель полей) :источник
unset IFS
позже, чтобы другие команды не влияли на эту же оболочку.$
значит вIFS=$'\n'
?$
заставляет разрывы строк работать внутри строки. Это также должно быть сделаноlocal IFS=$'\n'
внутри функции.$'...'
известен как « цитирование ANSI-C »for
циклы разбиваются на любые пробелы (пробел, табуляция, новая строка) по умолчанию; самый простой способ работать с одной строкой за раз - это использоватьwhile read
цикл, который разделяется на новые строки:Я ожидаю, что ваша команда будет выдавать по одному слову в строке (это произошло, когда я проверил это с помощью собственного файла). Если что-то еще происходит, я не уверен, что может быть причиной этого.
источник
for i in `ls`; do echo $1; done
, по конвейеру вывод команде в то время как:ls|while read i; do echo $i; done
. Это работает с именами файлов / папок с пробелами, без необходимости изменения переменных среды. Очень хороший ответls
он не считается безопасным для использования с|
(оператором конвейера).find
является более гибким в дополнение к тому, чтобы быть более безопасным для этой цели.pbpaste | while read t; do echo "<string>$t</string>"; done
ls -1
может использоваться с|
гарантией неформатированного вывода по одной строкеПроверенная работа, не тот лайнер, который вы, вероятно, хотите, но это невозможно сделать элегантно.
источник
Вот небольшое расширение ответа Митчелла Керри, которое мне нравится из-за небольшого количества побочных эффектов, которое позволяет избежать необходимости устанавливать переменную:
источник
-name '*'
и было бы то же самое, нет?Я бы написал это так:
поскольку требует наименьшего количества изменений в исходном скрипте (за исключением использования решения
IFS
, но оно изменяетbash
поведение не только для этого оператора управления циклом).источник
cat
здесь не нужны.while
цикл принимает перенаправление очень хорошо, поэтому обычно это пишется какwhile IFS= read -r line; do...done < input.txt
Mapfile - это удобный способ чтения строк из файла в индексированный массив, не такой переносимый, как чтение, но немного быстрее. Используя цикл for, вы избегаете создания подоболочки.
Имейте в виду, что при использовании конвейеров он будет помещать цикл while в подоболочку. Изменения внутри переменных типа цикла while не будут распространяться на внешнюю часть скрипта.
Пример:
(Лучшее решение):
источник
Дэндальф очень близко подошел к функциональному решению, но НИКОГДА НЕ ДОЛЖНО пытаться присвоить результат неизвестных
find ~/.gdfuse -name '*'
величин ввода (т. Е. ) Переменным! Или, по крайней мере, попытаться сделать это через переменную массива; если вы настаиваете на том, чтобы быть таким ленивым! Итак, вот решение Дэндальфа, выполненное без опасного маневра; и всего в одной строкеисточник