Як я можу прочитати введення користувача як масив у Bash?


15

Як я міг прочитати введення користувача у вигляді масиву в bashоболонці?


Я припускаю, що ти хочеш читати зі stdin? Моя відповідь також буде працювати з виконанням на кшталт cat war_and_peace.txt | ./array_test.sh.
Стефано Палацо

Або просто ./array_test.sh < war_and_peace.txt.
Елія Каган

Відповіді:


14

Ось один із способів зробити це:

while read line
do
    my_array=("${my_array[@]}" $line)
done

echo ${my_array[@]}

Якщо ви просто запустите його, він буде тримати зчитування зі стандартного вводу, поки ви не натиснете Ctrl + D (EOF). Після цього з’являться рядки, які ви ввели my_array. Деякі можуть вважати цей код заплутаним. Тіло петлі в основному говорить my_array = my_array + element.

Деякі цікаві документи:


3
read -rІноді є досить корисним / важливим ... Посилання Стефано на "прочитану вбудовану сторінку" пояснює її призначення ... (для запобігання інтерпретації зворотної косої риси).
Пітер.О

10

Прочитайте, користуючись цим:

read -a arr

А для друку використовуйте:

for elem in ${arr[@]}
do 
  echo $elem
done

4

І той, який не відтворює масив кожен раз (хоча вимагає 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теж ...
Peter.O

0

Як щодо цього однолистового;)

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 в змінній оболонки з труби та в башті, прочитаному після того, як труба не задає значення .


ти це випробував?
cmak.fr

@ cmak.fr так, це працює для мене
Quark

@Melebius Я додав пояснення щодо цього та переваги цього однолінійного.
Цзяхао Сю
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.