Bagaimana cara iterate yang benar pada baris di bash baik dalam variabel, atau dari output perintah? Cukup mengatur variabel IFS ke baris baru berfungsi untuk output dari perintah tetapi tidak ketika memproses variabel yang berisi baris baru.
Sebagai contoh
#!/bin/bash
list="One\ntwo\nthree\nfour"
#Print the list with echo
echo -e "echo: \n$list"
#Set the field separator to new line
IFS=$'\n'
#Try to iterate over each line
echo "For loop:"
for item in $list
do
echo "Item: $item"
done
#Output the variable to a file
echo -e $list > list.txt
#Try to iterate over each line from the cat command
echo "For loop over command output:"
for item in `cat list.txt`
do
echo "Item: $item"
done
Ini memberikan output:
echo:
One
two
three
four
For loop:
Item: One\ntwo\nthree\nfour
For loop over command output:
Item: One
Item: two
Item: three
Item: four
Seperti yang Anda lihat, menggemakan variabel atau mengulangi cat
perintah mencetak setiap baris satu per satu dengan benar. Namun, yang pertama untuk loop mencetak semua item dalam satu baris. Ada ide?
Jawaban:
Dengan bash, jika Anda ingin menyematkan baris baru dalam sebuah string, lampirkan string dengan
$''
:Dan jika Anda sudah memiliki string dalam variabel, Anda dapat membacanya baris demi baris dengan:
sumber
done <<< "$list"
itu sangat pentingdone <<< "$list"
sangat penting adalah karena itu akan lulus "$ list" sebagai masukan untukread
$list
sangat penting.echo "$list" | while ...
bisa tampak lebih jelas daripada... done <<< "$line"
Anda dapat menggunakan
while
+read
:Btw. yang
-e
pilihan untukecho
non-standar. Gunakanprintf
sebagai gantinya, jika Anda menginginkan portabilitas.sumber
<<<
versi yang disarankan oleh glenn jackman tidak bekerja dengan variabel tugas.while
bagian tersebut. The<<<
Versi tidak (dalam versi pesta baru, setidaknya).sumber
IFS=$'\n'
untuk efek yang sama.Berikut cara lucu untuk melakukan for loop Anda:
Sedikit lebih masuk akal / mudah dibaca adalah:
Tapi itu terlalu rumit, Anda hanya perlu ruang di sana:
Anda
$line
variabel tidak mengandung baris. Ini berisi contoh\
diikuti olehn
. Anda dapat melihatnya dengan jelas dengan:Substitusi ini menggantikan yang memiliki spasi, yang cukup untuk membuatnya bekerja untuk loop:
Demo:
sumber
cr
Anda dapat menggunakan$'\n'
.Anda juga dapat pertama-tama mengonversi variabel menjadi array, kemudian beralih di atasnya.
Ini hanya berguna jika Anda tidak ingin mengacaukannya
IFS
dan juga memiliki masalah denganread
perintah, karena itu bisa terjadi, jika Anda memanggil skrip lain di dalam loop itu skrip itu dapat mengosongkan buffer baca Anda sebelum kembali, seperti yang terjadi pada saya .sumber