Saya perhatikan bahwa untuk menetapkan baris baru IFS
harus dengan awalan $ sebagai
IFS=$'\n'
tetapi jika diatur titik dua, adil
IFS=:
Apakah \n
variabel?
Itu $'...'
di bash
tidak parameter ekspansi, itu adalah jenis khusus dari kutipan diperkenalkan oleh ksh93
yang memperluas mereka \n
, \x0a
, \12
kode untuk karakter baris baru. zsh
juga ditambahkan \u000a
. ksh93
dan bash
juga memiliki \cj
sementara zsh
memiliki \C-J
. ksh93
juga mendukung variasi suka \x{a}
.
Ini $
adalah isyarat bahwa itu adalah suatu bentuk atau ekspansi. Tetapi bagaimanapun juga, ini berbeda dari bentuk ekspansi lain yang menggunakan $
(seperti $((1 + 1))
, $param
atau $(cmd)
) dalam hal itu tidak dilakukan di dalam tanda kutip ganda atau dokumen di sini ( echo "$'x'"
output $'x'
di semua shell meskipun tidak ditentukan per POSIX) dan ekspansi tidak dapat dibagi + glob, ini pasti lebih dekat ke operator kutipan daripada operator ekspansi.
IFS=\n
akan mengatur IFS ke n
( \
diperlakukan sebagai operator mengutip) dan IFS="\n"
atau IFS='\n'
akan mengatur IFS ke dua karakter backslash dan n
.
Anda juga bisa menggunakan:
IFS='
'
atau
IFS="
"
atau
IFS=$'
'
Untuk lulus baris baru literal, meskipun itu kurang terbaca (dan satu tidak bisa melihat selain menggunakan hal-hal seperti set list
di vi
apakah $IFS
mengandung karakter spasi lain dalam kode itu).
IFS=:
, IFS=':'
, IFS=":"
, IFS=$':'
Siap IFS untuk :
jadi tidak masalah yang Anda gunakan.
$'...'
didukung (dengan variasi) oleh setidaknya: ksh93
, zsh
, bash
, mksh
, busybox sh
, FreeBSD sh
. ksh93
dan bash
juga memiliki $"..."
bentuk kutipan yang digunakan untuk pelokalan teks meskipun jarang digunakan karena rumit untuk digunakan dan digunakan dengan mudah dan andal.
The es
dan fish
kerang juga dapat menggunakan \n
di luar tanda kutip untuk memperluas ke baris baru.
Beberapa alat seperti printf
, beberapa implementasi echo
atau awk
juga dapat mengembangkannya \n
sendiri. Misalnya, seseorang dapat melakukan:
printf '\n'
awk 'BEGIN{printf "\n"}'
echo
echo '\n\c' # UNIX compliant echos only
untuk menghasilkan karakter baris baru, tetapi perhatikan bahwa:
IFS = $ (printf '\ n')
tidak akan berfungsi karena substitusi perintah ( $(...)
) menghapus semua karakter karakter baris baru. Namun Anda dapat menggunakan:
eval "$(printf 'IFS="\n"')"
Yang berfungsi karena hasil printf
akhir diakhiri dengan "
karakter, bukan baris baru.
Sekarang, untuk kelengkapan, di rc
shell dan turunannya (suka es
atau akanga
), $'\n'
memang merupakan perluasan dari \n
variabel itu (variabel yang namanya adalah urutan dua karakter \
dan n
). Mereka kerang tidak memiliki batasan pada apa karakter nama variabel mungkin berisi dan hanya memiliki satu jenis kutipan: '...'
.
$ rc
; '\n' = (foo bar)
; echo $'\n'
foo bar
; echo $'\n'(1)
foo
rc
variabel juga semua diekspor ke lingkungan, tetapi setidaknya dalam varian Unix rc
, untuk nama variabel seperti \n
, versi variabel lingkungan mengalami bentuk pengkodean:
; env | grep foo | sed -n l
__5cn=foo\001bar$
( 0x5c
menjadi nilai byte ASCII \
; lihat juga bagaimana variabel array dikodekan dengan byte 0x1 sebagai pemisah).
+1
untuk tingkat pengetahuan tidak manusiawi yang biasaIni adalah kutipan ANSI-C :
Dengan demikian
$'\n'
digantikan oleh baris baru.Ini tidak terkait dengan ekspansi parameter shell , meskipun menggunakan
$
.sumber
String seperti
$'\n'
telah diperkenalkan olehksh93
dan saat ini bukan bagian dari standar POSIX.Mereka memungkinkan untuk menggunakan sebagian besar C sama seperti escapes, misalnya
$'\u2345'
dan escapes yang juga didukung olehecho
.Perhatikan bahwa jika Anda tidak suka (jika menggunakan ksh93 atau bash) untuk menggunakan metode melarikan diri itu, Anda masih dapat menggunakan:
yang setara tapi lebih sulit dibaca.
BTW: Ekstensi ini telah melewati komite standar POSIX, tetapi dijadwalkan untuk SUSv8 yang diharapkan akan muncul tidak sebelum tahun 2020 karena kita pertama-tama perlu bekerja pada kelambatan kita di belakang daftar bug saat ini.
sumber
$'...'
ekspansi berbeda dari yangecho
. Mereka lebih seperti yang untuk argumen formatprintf
. Sebabecho
, 0 diperlukan\0123
sementara untuk$'...'
danprintf
format,\0123
akan menjadi\012
baris baru diikuti oleh litteral 3.$'...'
spesifikasinya masih dibahas. Ada beberapa masalah yang masih harus diselesaikan dengan kata-kata yang saat ini diusulkan.\uxxxx
ekspansi), dan tidak ada resolusi yang terlihat yang akan mengakomodasi implementasi yang ada. Jadi itu mungkin tidak membuatnya menjadi versi POSIX berikutnya. Mungkin mereka bisa membiarkan\uxxxx
ekspansi keluar untuk edisi 8, jadi kita masih bisa memiliki setidaknya$'\n'
.