Как я могу прочитать пользовательский ввод как массив в bash
оболочке?
./array_test.sh < war_and_peace.txt
.
Как я могу прочитать пользовательский ввод как массив в bash
оболочке?
./array_test.sh < war_and_peace.txt
.
Ответы:
Вот один из способов сделать это:
while read line
do
my_array=("${my_array[@]}" $line)
done
echo ${my_array[@]}
Если вы просто запустите его, он будет продолжать читать со стандартного ввода, пока вы не нажмете Ctrl + D (EOF). После этого введенные вами строки будутmy_array
. Некоторые могут найти этот код запутанным. Тело цикла в основном говорит my_array = my_array + element
.
Несколько интересных частей документации:
В расширенном руководстве по Bash-Scripting есть большая глава о массивах
Man-страница прочитанного встроенного
15 примеров массивов от thegeekstuff.com
read -r
иногда очень полезно / важно ... Ссылка Стефано на «прочитанную встроенную страницу руководства» объясняет его назначение ... (чтобы предотвратить интерпретацию обратной косой черты).
И тот, который не воссоздает массив каждый раз (хотя требует bash 3.1 или новее):
array=()
while IFS= read -r -p "Next item (end with an empty line): " line; do
[[ $line ]] || break # break if line is empty
array+=("$line")
done
printf '%s\n' "Items read:"
printf ' «%s»\n' "${array[@]}"
Смотрите http://mywiki.wooledge.org/BashFAQ/001 для получения дополнительной информации.
И как всегда, чтобы избежать написания ошибок, прочитайте http://mywiki.wooledge.org/BashGuide и избегайте руководств tldp, таких как Руководство по написанию сценариев Advanced bash.
IFS
проблему. Не обнуляя его, «читайте» все начальные и конечные пробелы ... и, конечно, -r
тоже ...
Как насчет этого однострочника;)
arr=( $(cat -) )
echo ${arr[@]}
Редактировать:
В bash
,
arr=(val1 val2 ...)
это способ присвоения массива . Используя его в сочетании с подстановкой команд, вы можете читать массивы из конвейера, которые невозможно использовать read
для прямой реализации этого:
echo -e "a\nb" | read -a arr
echo ${arr[@]}
Вы обнаружите, что он ничего не выводит из-за того, что read
он ничего не делает, когда stdin
является конвейером, поскольку конвейер может быть запущен в подоболочке, так что переменная может вообще не использоваться.
Используя способ, предложенный этим ответом:
arr=(`echo -e "a\nb"`)
echo ${arr[@]}
Это a b
намного проще и понятнее, чем любой обходной путь, заданный ответами чтения значений в переменную оболочки из канала и при чтении в bash после того, как канал не устанавливает значения .
cat war_and_peace.txt | ./array_test.sh
.