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