Bagaimana saya bisa membaca input pengguna sebagai array di Bash?

15

Bagaimana saya bisa membaca input pengguna sebagai array di bashshell?

moata_u
sumber
Saya kira Anda ingin membaca dari stdin? Jawaban saya juga akan berfungsi dengan eksekusi seperti cat war_and_peace.txt | ./array_test.sh.
Stefano Palazzo
Atau sederhananya ./array_test.sh < war_and_peace.txt.
Eliah Kagan

Jawaban:

14

Inilah satu cara untuk melakukannya:

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

echo ${my_array[@]}

Jika Anda hanya menjalankannya, ia akan terus membaca dari input standar sampai Anda menekan Ctrl + D (EOF). Setelah itu, baris yang Anda masukkan akan masuk my_array. Beberapa orang mungkin menganggap kode ini membingungkan. Tubuh loop pada dasarnya mengatakan my_array = my_array + element.

Beberapa lembar dokumentasi yang menarik:

Stefano Palazzo
sumber
3
read -rkadang cukup berguna / penting ... Tautan Stefano ke "read builtin manpage" menjelaskan tujuannya ... (untuk mencegah interpretasi backslash).
Peter.O
10

Baca menggunakan ini:

read -a arr

Dan untuk mencetak, gunakan:

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

Dan yang tidak membuat ulang array setiap kali (meskipun membutuhkan bash 3.1 atau yang lebih baru):

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[@]}"

Lihat http://mywiki.wooledge.org/BashFAQ/001 untuk lebih lanjut.

Dan seperti biasa, untuk menghindari penulisan bug baca http://mywiki.wooledge.org/BashGuide dan hindari tldp-guide seperti Advanced scripting bash guide.

geirha
sumber
Tautan yang bagus ... Terima kasih telah menunjukkan IFSmasalahnya. Tanpa membatalkannya, 'baca' membuat semua spasi putih mengarah dan tertinggal ... dan tentu saja -rterlalu ...
Peter.O
0

Bagaimana dengan one-liner ini;)

arr=( $(cat -) )
echo ${arr[@]}

Edit:

Di bash,

arr=(val1 val2 ...)

adalah cara menugaskan ke array . Dengan menggunakannya bersamaan dengan penggantian perintah, Anda dapat membaca dalam array dari pipeline yang tidak mungkin digunakan readuntuk mencapai ini dengan cara yang mudah:

echo -e "a\nb" | read -a arr
echo ${arr[@]}

Anda akan menemukan bahwa itu tidak menghasilkan apa-apa karena fakta bahwa readtidak melakukan apa-apa ketika stdinpipa karena pipa dapat dijalankan dalam subkulit sehingga variabel mungkin tidak dapat digunakan sama sekali.

Menggunakan cara yang disarankan oleh jawaban ini:

arr=(`echo -e "a\nb"`)
echo ${arr[@]}

Ini memberikan a bcara yang lebih sederhana dan lebih mudah daripada solusi yang diberikan oleh jawaban nilai Baca ke dalam variabel shell dari pipa dan dalam bash membaca setelah pipa tidak menetapkan nilai .

Quark
sumber
apakah kamu mengujinya?
cmak.fr
@ cmak.fr ya itu bekerja untuk saya
Quark
@Melebius Saya telah menambahkan penjelasan tentang itu dan keuntungan dari one-liner ini.
JiaHao Xu