Як я міг прочитати введення користувача у вигляді масиву в 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.
Деякі цікаві документи:
Advanced Bash-Scripting Guide має велику главу про масивах
Сторінка прочитаного вбудованого
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-путівників на кшталт Додаткового посібника з написання сценаріїв.
IFSпроблему. Не змінюючи його, "read" викреслює всі провідні та кінцеві пробіли ... і, звичайно, -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простіший і прямолінійний спосіб, ніж будь-яке вирішення заданих відповідями значень Read в змінній оболонки з труби та в башті, прочитаному після того, як труба не задає значення .
cat war_and_peace.txt | ./array_test.sh.