Bagaimana saya bisa membaca input pengguna sebagai array di bash
shell?
./array_test.sh < war_and_peace.txt
.
Bagaimana saya bisa membaca input pengguna sebagai array di bash
shell?
./array_test.sh < war_and_peace.txt
.
Jawaban:
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:
Panduan Bash-Scripting Lanjutan memiliki bab hebat tentang array
Manualnya dari membaca builtin
15 contoh array dari thegeekstuff.com
read -r
kadang cukup berguna / penting ... Tautan Stefano ke "read builtin manpage" menjelaskan tujuannya ... (untuk mencegah interpretasi backslash).
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.
IFS
masalahnya. Tanpa membatalkannya, 'baca' membuat semua spasi putih mengarah dan tertinggal ... dan tentu saja -r
terlalu ...
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 read
untuk 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 read
tidak melakukan apa-apa ketika stdin
pipa 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 b
cara 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 .
cat war_and_peace.txt | ./array_test.sh
.