Saya membaca utas ini: Bagaimana cara melompati baris file?
Apa IFS
? Dan apa for
gunanya dalam konteks -loops?
Saya membaca utas ini: Bagaimana cara melompati baris file?
Apa IFS
? Dan apa for
gunanya dalam konteks -loops?
IFS
singkatan - 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.Input
Internal Field Separator
\n
for
IFS
BTW, dari jawaban yang Anda posting solusi kedua adalah yang direkomendasikan ...
Seperti @jasonwryan perhatikan, itu bukan Input
tapi Internal
. Nama Input
berasal dari awk
mana ada juga OFS
- Output Field Separator
.
S
adalah untuk pemisah di kulit Bourne dari mana asalnya. Dalam shell Korn dan sebagian besar shell Bourne-seperti yang sekarang telah ditentukan olehPOSIX
,S
adalah untuk Pembatas (hanya meregangkan imajinasi Anda sedikit) sepertiA::B:
misalnya dibagi menjadi "A", "" dan "B" (tidak ada tambahan ""). Itu berbeda dariawk
'sFS
ataus
bendera perluasan parameterzsh
.IFS
tidak terkait langsung dengan perulangan, ini terkait dengan pemisahan kata.IFS
secara tidak langsung menentukan bagaimana output dari perintah dipecah menjadi beberapa bagian yang berulang-ulang berulang.Ketika Anda memiliki substitusi variabel
$foo
atau substitusi perintah yang tidak dilindungi$(foo)
, ada dua kasus:"$foo"
, atau dalam penugasan variabelx=$foo
, maka string yang dihasilkan dari substitusi tersebut digunakan apa adanya.$IFS
dianggap sebagai pemisah kata. MisalnyaIFS=":"; foo="12:34::78"; echo $foo
mencetak12 34 78
(dengan dua spasi di antara34
dan78
, karena ada kata kosong).foo="*"; echo $foo
mencetak daftar file di direktori saat ini.Untuk loop, seperti banyak konteks lainnya, mengharapkan daftar kata-kata. Begitu
memecah
$(foo)
menjadi kata-kata, dan memperlakukan setiap kata sebagai pola gumpalan. Nilai defaultIFS
adalah spasi, tab dan baris baru , jadi jikafoo
mencetak dua barishello world
danhowdy
kemudian loop body dieksekusi denganx=hello
, makax=world
danx=howdy
. JikaIFS
secara eksplisit diubah hanya berisi baris baru, maka loop dijalankan untukhello world
danhowdy
. JikaIFS
diubah menjadio
, maka loop dijalankan untukhell
, w
,rldh
(di mana
adalah karakter baris baru) danwdy
.sumber
"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
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.
http://tldp.org/LDP/abs/html/internalvariables.html
sumber
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:
Harap perhatikan bahwa kita perlu menyimpan dan memulihkan nilai IFS sebelumnya untuk menghindari kerusakan yang tidak diinginkan di bagian skrip lain.
sumber