Katakanlah saya punya file ini:
hello
world
hello world
Program ini
#!/bin/bash
for i in $(cat $1); do
echo "tester: $i"
done
output
tester: hello
tester: world
tester: hello
tester: world
Saya ingin memiliki for
iterate atas setiap baris secara individual mengabaikan spasi putih, yaitu dua baris terakhir harus diganti oleh
tester: hello world
Menggunakan kutipan for i in "$(cat $1)";
menghasilkan i
seluruh file sekaligus. Apa yang harus saya ubah?
sumber
<
ke seluruh lingkaran. Meskipun masuk akal sekarang saya melihatnyaIFS \ read -r line' in second example. Is really
IFS = `diperlukan? IMHO cukup untuk mengatakan:while read -r line; do echo "tester: $line"; done < "$1"
IFS=
mematikan pengupasan spasi putih terkemuka dan tertinggal. Lihat Diwhile IFS= read..
, mengapa IFS tidak berpengaruh?Untuk apa nilainya, saya perlu melakukan itu cukup sering, dan tidak pernah dapat mengingat cara penggunaan yang tepat
while IFS= read...
, jadi saya mendefinisikan fungsi berikut di profil bash saya:Fungsi ini pertama-tama menentukan jumlah baris dalam file, kemudian digunakan
sed
untuk mengekstrak baris demi baris, dan meneruskan setiap baris sebagai argumen string tunggal ke fungsi yang diberikan. Saya kira ini mungkin menjadi sangat tidak efisien dengan file besar, tapi itu belum menjadi masalah bagi saya sejauh ini (saran tentang bagaimana meningkatkan sambutan ini tentu saja).Penggunaannya IMO cukup manis:
sumber