Jika contoh berikut, yang menetapkan IFS
variabel lingkungan ke karakter umpan baris ...
IFS=$'\n'
- Apa tanda dolar berarti persis ?
- Apa fungsinya dalam kasus khusus ini?
- Di mana saya dapat membaca lebih lanjut tentang penggunaan khusus ini (Google tidak mengizinkan karakter khusus dalam pencarian dan saya tidak tahu harus mencari apa)?
Saya tahu apa itu IFS
variabel lingkungan, dan apa \n
karakternya (umpan baris), tetapi mengapa tidak menggunakan formulir berikut:
IFS="\n"
(yang tidak berfungsi)?
Misalnya, jika saya ingin mengulang setiap baris file dan ingin menggunakan for loop, saya bisa melakukan ini:
for line in (< /path/to/file); do
echo "Line: $line"
done
Namun, ini tidak akan berfungsi dengan benar kecuali IFS
disetel ke karakter umpan baris. Agar berhasil, saya harus melakukan ini:
OLDIFS=$IFS
IFS=$'\n'
for line in (< /path/to/file); do
echo "Line: $line"
done
IFS=$OLDIFS
Catatan: Saya tidak memerlukan cara lain untuk melakukan hal yang sama, saya sudah tahu banyak cara lain ... Saya hanya ingin tahu tentang itu $'\n'
dan bertanya-tanya apakah ada yang bisa memberi saya penjelasan tentang itu.
\n
hanya huruf (lolos) n. Anda benar'\n'
dan"\n"
reaksi diikuti oleh n.$'\n'
bash spesifik - ini tidak akan berfungsi di shell POSIX (/bin/sh
). Untuk mendapatkan efek yang sama dengan cara yang sesuai dengan POSIX, Anda dapat mengetikIFS='
, lalu tekan kembali untuk mengetik karakter baris baru yang sebenarnya, lalu ketik penutup'
IFS=$(echo -e '\n')
juga harus melakukannya dengan cara yang kompatibel dengan POSIX.-e
tidak didefinisikan, dan\n
tanpa-e
bekerja sebagai ekstensi XSI: pubs.opengroup.org/onlinepubs/9699919799/utilities/… .printf '\n'
batu;)Hanya untuk memberi nama resminya pada konstruksi : string dari formulir
$'...'
disebut string yang dikutip C ANSI .Yaitu, seperti dalam string [ANSI] C, urutan escape backlash dikenali dan diperluas ke padanan literalnya (lihat di bawah untuk daftar lengkap dari urutan escape yang didukung).
Setelah perluasan ini,
$'...'
string berperilaku sama seperti'...'
string - yaitu, string diperlakukan sebagai literal TIDAK tunduk pada ekspansi shell [lebih lanjut] .Misalnya,
$'\n'
memperluas ke karakter baris baru literal - yang tidak dapat dilakukan oleh literal string bash biasa (baik'...'
atau"..."
). [1]Fitur menarik lainnya adalah string yang dikutip C ANSI dapat keluar
'
(tanda kutip tunggal) karena\'
,'...'
(string yang dikutip tunggal reguler) tidak dapat:Daftar urutan pelolosan yang didukung :
[1] Namun, Anda dapat menyematkan baris baru yang sebenarnya dalam string '...' dan "..."; yaitu, Anda dapat menentukan string yang menjangkau beberapa baris.
sumber
Dari http://www.linuxtopia.org/online_books/bash_guide_for_beginners/sect_03_03.html :
Saya kira itu memaksa skrip untuk keluar dari umpan baris ke standar ANSI-C yang tepat.
sumber
Memulihkan kembali IFS default- ini
OLDIFS=$IFS
tidak perlu. Jalankan IFS baru di subkulit untuk menghindari menimpa IFS default:Selain itu, saya tidak yakin Anda memulihkan IFS lama sepenuhnya. Anda harus mengutipnya dua kali untuk menghindari pemutusan baris seperti
OLDIFS="$IFS"
.sumber
args=$(IFS='&'; echo "$*")
. memulihkanIFS
dengan$' \t\n'
cara yang ramah Bourne shell bukanlah prestasi yang berarti.Besides I don't really believe you recover the old IFS fully
: pemisahan kata tidak dilakukan di kanan variabel tugas (tapi penghapusan kutipan), jadiOLDIFS=$IFS
danOLDIFS="$IFS"
berperilaku dengan cara yang sama.String yang dikutip ANSI C adalah poin kunci. Terima kasih kepada @ mklement0.
Anda dapat menguji string yang dikutip C ANSI dengan perintah od.
Keluaran:
Anda dapat mengetahui artinya dengan jelas dari keluarannya.
sumber
Ini seperti mengambil nilai dari variabel:
berbeda, jadi tanda dolar pada dasarnya mengevaluasi konten.
sumber
$'FOO'
(tidak seperti$FOO
pertanyaan ini yang bukan tentang) adalah string literal. Jika Anda mengeksekusiecho $'VAR'
, Anda akan melihat bahwa itu mencetak stringVAR
, bukantest
.