Saya membaca bahwa menulis hal-hal seperti itu buruk for line in $(command)
, sepertinya cara yang benar:
command | while IFS= read -r line; do echo $line; done
Ini sangat bagus. Tetapi bagaimana jika apa yang ingin saya lakukan adalah isi dari suatu variabel , bukan hasil langsung dari suatu perintah?
Misalnya, bayangkan Anda membuat file berikut quickfox
:
The quick brown
foxjumps\ over -
the
lazy ,
dog.
Saya ingin dapat melakukan sesuatu seperti ini:
# This is just for the example,
# I could of course stream the contents to `read`
variable=$(cat quickfox);
while IFS= read -r line < $variable; do echo $line; done; # this is incorrect
$variable
ketika Anda menggunakannya, jika tidak,while
loop hanya akan mendapatkan satu baris input. Lihat, misalnya, perbedaan output antaraecho $variable
vsecho "$variable"
ataucat <<< $variable
vscat <<< "$variable"
.variable=$(cat quickfox)
OP sendiri memberikan contoh tentang apa yang saya bicarakan. Menggunakannya$variable
di dalam tanda kutip ganda termasuk baris baru, menggunakannya tanpa baris baru diterjemahkan ke spasi oleh shell. Jika Anda membaca dan memproses baris demi baris, ini membuat perbedaan besar - dengan yang pertama Anda memiliki beberapa baris input, dengan yang terakhir Anda hanya memiliki satu baris input. Data input serupa secara dangkal tetapi, dalam praktiknya, sangat berbeda dalam kedua kasus tersebut.cat <<< "$variable" | wc -l
mengembalikan 5.cat <<< $variable | wc -l
pengembalian 1. Jika Anda ingin / perlu mempertahankan spasi putih (termasuk baris baru, tab, spasi tunggal atau banyak) dalam suatu variabel, maka Anda HARUS mengutip dua kali variabel ketika Anda menggunakannya, jika tidak mereka semua akan diubah menjadi satu ruang tunggal di antara setiap "kata".