Iterasi lebih dari beberapa baris string yang disimpan dalam variabel


17

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

Jawaban:


19

Dalam shell modern seperti bash dan zsh, Anda memiliki pengalihan `<<< 'yang sangat berguna yang menerima string sebagai input. Jadi kamu akan melakukannya

while IFS= read -r line ; do echo $line; done <<< "$variable"

Kalau tidak, Anda selalu bisa melakukannya

echo "$variable" | while IFS= read -r line ; do echo $line; done

Maaf, saya seharusnya memikirkan untuk menggemakan konten tentunya. Tapi terima kasih atas jawaban cepatnya!
Sheljohn

1
Anda perlu menggandakan penawaran $variableketika Anda menggunakannya, jika tidak, whileloop hanya akan mendapatkan satu baris input. Lihat, misalnya, perbedaan output antara echo $variablevs echo "$variable"atau cat <<< $variablevs cat <<< "$variable".
cas

@cas Sebenarnya itu tergantung pada apa yang ada di dalam $ variabel. Dalam kasus yang disajikan oleh OP ("variabel = $ (cat quickfox)") ini bekerja tanpa tanda kutip tambahan. Tetapi untuk kasus umum, Anda benar. Saya mengedit jawaban saya. Terima kasih.
Sayang

Pertanyaan variable=$(cat quickfox)OP sendiri memberikan contoh tentang apa yang saya bicarakan. Menggunakannya $variabledi 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.
cas

misalnya: dengan data input itu, cat <<< "$variable" | wc -lmengembalikan 5. cat <<< $variable | wc -lpengembalian 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".
cas
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.