Bash массив из файла

Я пытаюсь прочитать файл, содержащий строки, в массив Bash.

Я пробовал следующее:

Обе попытки возвращают только один массив элементов, содержащий первую строку файла. Что я делаю не так?

Я бегу bash 4.1.5

6 ответов

94 Решение nhed [2012-07-09 14:10:00]

Используйте $IFS, у которого нет пробелов abs, только символы новой строки /CR

Также обратите внимание, что вы можете настроить массив просто отлично, но неправильно его прочитать — обязательно используйте как двойные кавычки "" , так и скобки <> , как в приведенном выше примере

Edit:

Обратите внимание на множество предупреждений о моем ответе в комментариях о возможном расширении glob, особенно gniourf-gniourf comments о моих предыдущих попытках обойти

Учитывая все эти предупреждения, я все еще оставляю этот ответ здесь (да, bash 4 уже много лет, но я помню, что некоторые маки только 2/3 года имеют pre-4 в качестве оболочки по умолчанию)

Другие примечания:

Можно также следовать приведенному ниже предложению drizzt и заменить раздвоенную подоболочку + cat с помощью

Другая опция, которую я иногда использую, — это просто установить IFS в XIFS, а затем восстановить после. См. Также Sorpigal answer, который не нужно беспокоиться об этом

A script принимает URL-адрес, анализирует его для обязательных полей и перенаправляет его вывод для сохранения в файле file.txt. Выход сохраняется на новой строке каждый раз, когда поле было найдено.

file.txt

Я хочу взять file.txt и создать массив из него в новом script, где каждая строка становится своей собственной строковой переменной в массиве. До сих пор я пробовал:

Когда я запускаю этот script, пробелы приводят к разрыву слов и вместо того, чтобы получать

Требуемый выход

Я получаю следующее:

Фактический выход

Как я могу настроить петлю ниже, так что вся строка в каждой строке будет соответствовать друг другу с каждой переменной в массиве?

Ошибка используется for — идиоматический способ зацикливания строк файла:

Смотрите BashFAQ/005 для более подробной информации.

mapfile и readarray (которые являются синонимами) доступны в Bash версии 4 и выше. Если у вас более старая версия Bash, вы можете использовать цикл для чтения файла в массив:

Если у файла есть неполная (отсутствует новая строка) последняя строка, вы можете использовать эту альтернативу:

Вы также можете сделать это:

Расширение имени файла все еще происходит. Например, если есть строка с литеральным * , она будет распространяться на все файлы в текущей папке. Поэтому используйте его, только если ваш файл свободен от такого сценария.

Вы можете просто прочитать каждую строку из файла и назначить его массиву.

Использовать файл карты или прочитать -a

Всегда проверяйте свой код, используя shellcheck. Он часто даст вам правильный ответ. В этом случае SC2207 охватывает чтение файла, который либо разделяет пробел, либо разделяет значения новой строки в массиве.

Не делайте этого

Файлы со значениями, разделенные символами новой строки

Файлы со значениями, разделенными пробелами

Страница shellcheck даст вам обоснование, почему это считается лучшей практикой.

Этот ответ говорит, чтобы использовать

Я сделал shim для mapfile , если вы хотите использовать mapfile в bash mapfile , если вы находитесь на bash >= 4.x

В настоящее время работают только параметры -d и -t . Но этого должно быть достаточно для этой команды выше. Я тестировал только на macOS. В macOS Sierra 10.12.6 система bash равна 3.2.57(1)-release . Таким образом, прокладка может пригодиться. Вы также можете просто обновить свой bash с помощью homebrew, построить bash самостоятельно и т.д.

Он использует эту технику для установки переменных на один стек вызовов.

Есть файл, содержащий строки. Как прочитать из файла эти строки в массив в bash?

2 ответа 2

Так гораздо проще:

Всё ещё ищете ответ? Посмотрите другие вопросы с метками файлы массивы bash или задайте свой вопрос.

Похожие

Для подписки на ленту скопируйте и вставьте эту ссылку в вашу программу для чтения RSS.

дизайн сайта / логотип © 2019 Stack Exchange Inc; пользовательское содержимое попадает под действие лицензии cc by-sa 4.0 с указанием ссылки на источник. rev 2019.11.15.35459


[an error occurred while processing the directive]
Карта сайта