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?
Jawaban:
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 oleh POSIX
, S
adalah untuk Pembatas (hanya meregangkan imajinasi Anda sedikit) seperti A::B:
misalnya dibagi menjadi "A", "" dan "B" (tidak ada tambahan ""). Itu berbeda dari awk
's FS
atau s
bendera perluasan parameter zsh
.
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 variabel x=$foo
, maka string yang dihasilkan dari substitusi tersebut digunakan apa adanya.$IFS
dianggap sebagai pemisah kata. Misalnya IFS=":"; foo="12:34::78"; echo $foo
mencetak 12 34 78
(dengan dua spasi di antara 34
dan 78
, 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
for x in $(foo); do …
memecah $(foo)
menjadi kata-kata, dan memperlakukan setiap kata sebagai pola gumpalan. Nilai default IFS
adalah spasi, tab dan baris baru , jadi jika foo
mencetak dua baris hello world
dan howdy
kemudian loop body dieksekusi dengan x=hello
, maka x=world
dan x=howdy
. Jika IFS
secara eksplisit diubah hanya berisi baris baru, maka loop dijalankan untuk hello world
dan howdy
. Jika IFS
diubah 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.