Как я могу прочитать пользовательский ввод как массив в 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.