it-swarm-id.com

Apa arti dari IFS = $ '\ n' dalam skrip bash?

Di awal skrip bash Shell adalah baris berikut:

IFS=$'\n'

Apa arti di balik koleksi simbol ini?

180
Abdul Al Hazred

IFS singkatan dari "pemisah bidang internal". Ini digunakan oleh Shell untuk menentukan bagaimana melakukan pemisahan Firman, i. e. cara mengenali batas kata.

Coba ini di Shell seperti bash (shell lain mungkin menangani ini secara berbeda, misalnya zsh):

mystring="foo:bar baz rab"
for Word in $mystring; do
  echo "Word: $Word"
done

Nilai default untuk IFS terdiri dari karakter spasi putih (tepatnya: spasi, tab, dan baris baru). Setiap karakter dapat menjadi batas kata. Jadi, dengan nilai default IFS, loop di atas akan mencetak:

Word: foo:bar
Word: baz
Word: rab

Dengan kata lain, Shell berpikir bahwa spasi putih adalah batas kata.

Sekarang, coba atur IFS=: Sebelum menjalankan loop. Kali ini, hasilnya adalah:

Word: foo
Word: bar baz rab

Sekarang, Shell membagi mystring menjadi kata-kata juga - tetapi sekarang, ia hanya memperlakukan titik dua sebagai batas kata.

Karakter pertama IFS adalah spesial: Digunakan untuk membatasi kata-kata dalam output ketika menggunakan variabel khusus $* (Contoh diambil dari Panduan Skrip Bash Lanjutan , di mana Anda juga dapat menemukan informasi lebih lanjut tentang variabel khusus seperti itu):

$ bash -c 'set w x y z; IFS=":-;"; echo "$*"'
w:x:y:z

Dibandingkan dengan:

$ bash -c 'set w x y z; IFS="-:;"; echo "$*"'
w-x-y-z

Perhatikan bahwa dalam kedua contoh, Shell masih akan memperlakukan semua karakter :, - Dan ; Sebagai batas kata. Satu-satunya hal yang berubah adalah perilaku $*.

Satu hal penting yang perlu diketahui adalah bagaimana apa yang disebut "ruang kosong IFS" diperlakukan . Pada dasarnya, segera setelah IFS menyertakan karakter spasi putih, spasi spasi awal dan jejak dilucuti dari string yang akan dipisah sebelum memprosesnya dan urutan dari karakter spasi spasi berturut-turut juga membatasi bidang. Namun, ini hanya berlaku untuk karakter spasi putih yang sebenarnya ada dalam IFS.

Sebagai contoh, mari kita lihat string "a:b:: c d " (Trailing space dan dua karakter spasi antara c dan d).

  1. Dengan IFS=: Itu akan dibagi menjadi empat bidang: "a", "b", "" (String kosong) dan " c d " (Lagi, dua spasi antara c dan d). Perhatikan spasi putih terkemuka dan tertinggal di bidang terakhir.
  2. Dengan IFS=' :', Itu akan dibagi menjadi lima bidang: "a", "b", "" (String kosong), "c" Dan "d". Tidak ada spasi putih terkemuka dan tertinggal di mana pun.

Perhatikan bagaimana beberapa, karakter spasi putih berturut-turut membatasi dua bidang pada contoh kedua, sedangkan banyak, karakter titik dua berturut-turut tidak (karena mereka bukan karakter spasi putih).

Adapun IFS=$'\n', Itu adalah sintaks ksh93 Juga didukung oleh bash, zsh, mksh dan FreeBSD sh (dengan variasi di antara semua kerang). Mengutip manual bash:

Kata-kata dalam bentuk $ 'string' diperlakukan secara khusus. Word diperluas menjadi "string", dengan karakter backslash-escape diganti seperti yang ditentukan oleh standar ANSI C.

\n Adalah urutan keluar untuk baris baru, jadi IFS akhirnya disetel ke karakter baris baru.

216
Tblue

Di dalam kutipan tunggal boneka, beberapa karakter dievaluasi secara khusus. Sebagai contoh, \n diterjemahkan ke baris baru.

Jadi, baris khusus ini memberikan baris baru ke variabel IFS. IFS, pada gilirannya, adalah variabel khusus di bash: Pemisah Bidang Internal. Sebagai man bash mengatakan, itu

digunakan untuk pemisahan kata setelah ekspansi dan untuk memecah baris menjadi kata-kata dengan perintah read builtin. Nilai standarnya adalah <space><tab><newline>.

23
choroba

Ringkasnya, IFS=$'\n' menetapkan baris baru \n ke variabel IFS.

$'string' construct adalah mekanisme penawaran yang digunakan untuk mendekode ANSI C seperti escape sequence. Sintaks ini berasal dari ksh93, dan mudah dibawa ke Shell modern seperti bash, zsh, pdksh, busybox sh.

Sintaks ini tidak didefinisikan oleh POSIX, tetapi diterima untuk SUS issue 7 .

15
cuonglm