Beberapa utas berikut di situs ini dan StackOverflow sangat membantu untuk memahami bagaimana IFS
bekerja:
- Apa yang dimaksud dengan IFS dalam konteks perulangan?
- Cara mengulang baris file
- Bash, baca baris demi baris dari file, dengan IFS
Tapi saya masih punya beberapa pertanyaan singkat. Saya memutuskan untuk bertanya kepada mereka di pos yang sama karena saya pikir ini dapat membantu pembaca masa depan yang lebih baik:
Q1. IFS
biasanya dibahas dalam konteks "pemisahan bidang". Apakah pemisahan bidang sama dengan pemisahan kata ?
T2: Spesifikasi POSIX mengatakan:
Jika nilai IFS adalah nol, tidak ada pemisahan bidang yang akan dilakukan.
Apakah pengaturan IFS=
sama dengan pengaturan IFS
ke nol? Apakah ini yang dimaksud dengan menyetelnya ke empty string
juga?
P3: Dalam spesifikasi POSIX, saya membaca yang berikut:
Jika IFS tidak disetel, shell akan berperilaku seolah-olah nilai IFS adalah
<space>, <tab> and <newline>
Katakanlah saya ingin mengembalikan nilai default IFS
. Bagaimana aku melakukan itu? (lebih khusus, bagaimana cara merujuk ke <tab>
dan <newline>
?)
P4: Terakhir, bagaimana kode ini:
while IFS= read -r line
do
echo $line
done < /path_to_text_file
berperilaku jika kita mengubah baris pertama menjadi
while read -r line # Use the default IFS value
atau ke:
while IFS=' ' read -r line
Jawaban yang Diterima:
- Ya, mereka sama.
- Ya.
- Di bash, dan shell serupa, Anda bisa melakukan sesuatu seperti
IFS=$' tn'
. Jika tidak, Anda dapat menyisipkan kode kontrol literal dengan menggunakan[space] CTRL+V [tab] CTRL+V [enter]
. Namun, jika Anda berencana untuk melakukan ini, lebih baik menggunakan variabel lain untuk menyimpanIFS
yang lama untuk sementara. nilai, lalu pulihkan setelahnya (atau timpa sementara untuk satu perintah dengan menggunakanvar=foo command
sintaks). - Cuplikan kode pertama akan menempatkan seluruh baris yang dibaca, kata demi kata, ke dalam
$line
, karena tidak ada pemisah bidang untuk melakukan pemisahan kata. Namun perlu diingat bahwa karena banyak shell menggunakan cstring untuk menyimpan string, instance pertama dari NUL masih dapat menyebabkan tampilannya dihentikan sebelum waktunya. - Cuplikan kode kedua mungkin tidak memasukkan salinan input yang sama persis ke dalam
$line
. Misalnya, jika ada beberapa pemisah bidang berurutan, mereka akan dibuat menjadi satu contoh elemen pertama. Ini sering dikenali sebagai hilangnya spasi putih di sekitarnya. - Cuplikan kode ketiga akan melakukan hal yang sama seperti yang kedua, kecuali hanya akan dibagi pada spasi (bukan spasi, tab, atau baris baru biasa).
- Cuplikan kode pertama akan menempatkan seluruh baris yang dibaca, kata demi kata, ke dalam