Как я могу прочитать пользовательский ввод как массив в bash
оболочке?
command-line
bash
moata_u
источник
источник
cat war_and_peace.txt | ./array_test.sh
../array_test.sh < war_and_peace.txt
.Ответы:
Вот один из способов сделать это:
Если вы просто запустите его, он будет продолжать читать со стандартного ввода, пока вы не нажмете Ctrl + D (EOF). После этого введенные вами строки будут
my_array
. Некоторые могут найти этот код запутанным. Тело цикла в основном говоритmy_array = my_array + element
.Несколько интересных частей документации:
В расширенном руководстве по Bash-Scripting есть большая глава о массивах
Man-страница прочитанного встроенного
15 примеров массивов от thegeekstuff.com
источник
read -r
иногда очень полезно / важно ... Ссылка Стефано на «прочитанную встроенную страницу руководства» объясняет его назначение ... (чтобы предотвратить интерпретацию обратной косой черты).Прочитайте это, используя это:
А для печати используйте:
источник
И тот, который не воссоздает массив каждый раз (хотя требует bash 3.1 или новее):
Смотрите http://mywiki.wooledge.org/BashFAQ/001 для получения дополнительной информации.
И как всегда, чтобы избежать написания ошибок, прочитайте http://mywiki.wooledge.org/BashGuide и избегайте руководств tldp, таких как Руководство по написанию сценариев Advanced bash.
источник
IFS
проблему. Не обнуляя его, «читайте» все начальные и конечные пробелы ... и, конечно,-r
тоже ...Как насчет этого однострочника;)
Редактировать:
В
bash
,это способ присвоения массива . Используя его в сочетании с подстановкой команд, вы можете читать массивы из конвейера, которые невозможно использовать
read
для прямой реализации этого:Вы обнаружите, что он ничего не выводит из-за того, что
read
он ничего не делает, когдаstdin
является конвейером, поскольку конвейер может быть запущен в подоболочке, так что переменная может вообще не использоваться.Используя способ, предложенный этим ответом:
Это
a b
намного проще и понятнее, чем любой обходной путь, заданный ответами чтения значений в переменную оболочки из канала и при чтении в bash после того, как канал не устанавливает значения .источник