Saya membaca utas ini: Bagaimana cara melompati baris file?
Apa IFS? Dan apa forgunanya dalam konteks -loops?
Saya membaca utas ini: Bagaimana cara melompati baris file?
Apa IFS? Dan apa forgunanya dalam konteks -loops?
Jawaban:
IFSsingkatan - itu adalah karakter yang memisahkan bidang. Dalam contoh yang Anda poskan, ini disetel ke karakter baris baru ( ); jadi setelah Anda mengaturnya, akan memproses teks baris demi baris. Dalam contoh itu, Anda bisa mengubah nilai (ke beberapa huruf yang Anda miliki di file input) dan memeriksa bagaimana teks akan dibagi.InputInternal Field Separator\nforIFS
BTW, dari jawaban yang Anda posting solusi kedua adalah yang direkomendasikan ...
Seperti @jasonwryan perhatikan, itu bukan Inputtapi Internal. Nama Inputberasal dari awkmana ada juga OFS- Output Field Separator.
Sadalah untuk pemisah di kulit Bourne dari mana asalnya. Dalam shell Korn dan sebagian besar shell Bourne-seperti yang sekarang telah ditentukan oleh POSIX, Sadalah untuk Pembatas (hanya meregangkan imajinasi Anda sedikit) seperti A::B:misalnya dibagi menjadi "A", "" dan "B" (tidak ada tambahan ""). Itu berbeda dari awk's FSatau sbendera perluasan parameter zsh.
IFStidak terkait langsung dengan perulangan, ini terkait dengan pemisahan kata. IFSsecara tidak langsung menentukan bagaimana output dari perintah dipecah menjadi beberapa bagian yang berulang-ulang berulang.
Ketika Anda memiliki substitusi variabel $fooatau substitusi perintah yang tidak dilindungi $(foo), ada dua kasus:
"$foo", atau dalam penugasan variabel x=$foo, maka string yang dihasilkan dari substitusi tersebut digunakan apa adanya.$IFSdianggap sebagai pemisah kata. Misalnya IFS=":"; foo="12:34::78"; echo $foomencetak 12 34 78(dengan dua spasi di antara 34dan 78, karena ada kata kosong).foo="*"; echo $foomencetak daftar file di direktori saat ini.Untuk loop, seperti banyak konteks lainnya, mengharapkan daftar kata-kata. Begitu
for x in $(foo); do …
memecah $(foo)menjadi kata-kata, dan memperlakukan setiap kata sebagai pola gumpalan. Nilai default IFSadalah spasi, tab dan baris baru , jadi jika foomencetak dua baris hello worlddan howdykemudian loop body dieksekusi dengan x=hello, maka x=worlddan x=howdy. Jika IFSsecara eksplisit diubah hanya berisi baris baru, maka loop dijalankan untuk hello worlddan howdy. Jika IFSdiubah menjadi o, maka loop dijalankan untuk hell, w, rldh(di mana adalah karakter baris baru) dan wdy.
"IFS indirectly determines how ..."?
IFS(langsung) menentukan bagaimana output dari substitusi perintah dipecah, yang kemudian (secara tidak langsung) menentukan apa loop berulang.
Dari man bash
IFS Pemisah Bidang Internal yang digunakan untuk pemisahan kata setelah ekspansi dan untuk memecah baris menjadi kata-kata dengan perintah baca bawaan. Nilai standarnya adalah "<spasi> <tab> <newline>".
Ini adalah salah satu variabel internal Bash. Ini menentukan bagaimana Bash mengenali bidang, atau batas kata, ketika itu menerjemahkan string karakter.
Meskipun default ke spasi putih (spasi, tab, dan baris baru), mungkin diubah, misalnya, untuk mem-parsing file data yang dipisahkan koma.
Selain jawaban hebat sebelumnya, izinkan saya menambahkan bahwa IFS sangat berguna untuk penguraian portabel dan efisien dalam kasus-kasus sederhana dalam kombinasi dengan set . Efisien, karena menghindari penggunaan subkulit dan alat pemijahan seperti grep atau sed:
resolutions="640x480,320x240"
xIFS=$IFS
IFS=','
for res in $resolutions; do
xxIFS=$IFS
IFS='x'
set -- $res
width=$1
height=$2
# handle width and height
IFS=$xxIFS
done;
IFS=$xIFS
Harap perhatikan bahwa kita perlu menyimpan dan memulihkan nilai IFS sebelumnya untuk menghindari kerusakan yang tidak diinginkan di bagian skrip lain.