Jawaban:
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).
Ini adalah kutipan ANSI-C :
Kata-kata dalam bentuk
$'string'
diperlakukan secara khusus. Kata diperluas kestring
, dengan karakter backslash-escaped diganti sebagaimana ditentukan oleh standar ANSI C.
Dengan demikian $'\n'
digantikan oleh baris baru.
Ini tidak terkait dengan ekspansi parameter shell , meskipun menggunakan $
.
String seperti $'\n'
telah diperkenalkan oleh ksh93
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 oleh echo
.
Perhatikan bahwa jika Anda tidak suka (jika menggunakan ksh93 atau bash) untuk menggunakan metode melarikan diri itu, Anda masih dapat menggunakan:
IFS='
'
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.
$'...'
ekspansi berbeda dari yang echo
. Mereka lebih seperti yang untuk argumen formatprintf
. Sebab echo
, 0 diperlukan \0123
sementara untuk $'...'
dan printf
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'
.
+1
untuk tingkat pengetahuan tidak manusiawi yang biasa