Bergantung pada situasi yang tepat, ini bisa secara eksplisit tidak ditentukan (sehingga implementasi dapat melakukan apa yang mereka mau) atau diharuskan untuk terjadi saat Anda mengamati. Dalam skenario persis Anda echo ab$
, POSIX mengamanatkan keluaran "ab $" yang Anda amati dan tidak ditentukan . Ringkasan singkat dari semua kasus yang berbeda ada di akhir.
Ada dua elemen: pertama mencari kata-kata, dan kemudian menafsirkan kata-kata itu.
Tokenisasi
Tokenisasi POSIX mensyaratkan bahwa a $
yang bukan awal dari perluasan parameter yang valid , substitusi perintah , atau substitusi aritmatika untuk dianggap sebagai bagian literal dari WORD
token yang sedang dibangun. Ini karena aturan 5 ("Jika karakter saat ini adalah tanda kutip $
atau `
, shell harus mengidentifikasi awal dari setiap kandidat untuk ekspansi parameter, penggantian perintah, atau ekspansi aritmatika dari urutan karakter tanpa tanda kutip pengantar mereka: $
atau ${
, $(
atau `
, dan $((
, masing-masing" ) tidak berlaku, karena tidak ada ekspansi yang layak di sana. Perluasan parameter memerlukan nama yang valid untuk muncul di sana, dan nama yang kosong tidak valid.
Karena aturan ini tidak berlaku, kami terus mengikuti hingga kami menemukannya. Dua kandidat adalah # 8 ("Jika karakter sebelumnya adalah bagian dari sebuah kata, karakter saat ini akan ditambahkan ke kata itu.") Dan # 10 ("Karakter saat ini digunakan sebagai awal dari kata baru.") , yang berlaku untuk echo a$
dan echo $
masing - masing.
Ada juga kasus ketiga dari formulir echo a$+b
yang jatuh melalui celah yang sama, karena +
bukan nama parameter khusus. Yang ini akan kita bahas nanti, karena memicu berbagai bagian aturan.
Dengan demikian spesifikasi mensyaratkan bahwa kata $
tersebut dianggap sebagai bagian dari kata secara sintaksis, dan kemudian dapat diproses lebih lanjut di kemudian hari.
Perluasan kata
Setelah input diuraikan dengan cara ini, dengan yang $
termasuk dalam kata, ekspansi kata diterapkan ke setiap kata yang telah dibaca. Setiap kata diproses secara individual .
Ditetapkan bahwa :
Jika tanda kutip '$' diikuti oleh karakter yang bukan salah satu dari yang berikut:
- Karakter numerik
- Nama salah satu parameter khusus (lihat Parameter Khusus )
- Karakter pertama yang valid dari nama variabel
- A
<left-curly-bracket>
('{')
- SEBUAH
<left-parenthesis>
hasilnya tidak ditentukan.
"Tidak ditentukan" adalah istilah khusus di sini yang berarti
- Shell yang menyesuaikan dapat memilih perilaku apa pun dalam kasus ini
- Aplikasi yang sesuai tidak dapat mengandalkan perilaku tertentu
Dalam contoh Anda, echo ab$
, yang $
tidak diikuti oleh setiap karakter , sehingga aturan ini tidak berlaku dan hasil yang tidak ditentukan tidak dipanggil. Tidak ada ekspansi yang dipicu oleh $
, sehingga benar-benar ada dan dicetak.
Di mana itu akan berlaku dalam kasus ketiga kami dari atas: echo a$+b
. Berikut $
ini diikuti oleh +
yang bukan nomor, parameter khusus ( @
, *
, #
, ?
, -
, $
, !
, atau 0
), mulai dari variabel nama (garis bawah atau abjad dari set karakter portable ), atau salah satu dari tanda kurung. Dalam kasus ini, perilaku tidak ditentukan: shell yang sesuai diizinkan untuk menciptakan parameter khusus yang dipanggil +
untuk memperluas , dan aplikasi yang sesuai tidak boleh berasumsi bahwa shell tidak . Shell dapat melakukan hal lain yang disukainya, termasuk melaporkan kesalahan.
Sebagai contoh, zsh, termasuk dalam mode POSIX-nya, mengartikan $+b
sebagai " b
set variabel " dan menggantikan 1 atau 0 sebagai gantinya. Ini juga memiliki ekstensi untuk ~
dan =
. Ini adalah perilaku yang sesuai.
Tempat lain yang bisa terjadi adalah echo "a$ b"
. Sekali lagi, shell diizinkan untuk melakukan $
apa yang diinginkan , dan Anda sebagai penulis naskah harus melarikan diri jika Anda ingin output literal. Jika tidak, ini mungkin berhasil, tetapi Anda tidak dapat mengandalkannya. Ini adalah huruf absolut dari spesifikasi, tetapi saya tidak berpikir granularity semacam ini dimaksudkan atau dipertimbangkan.
Singkatnya
echo ab$
: output literal, ditentukan sepenuhnya
echo a$ b
: output literal, ditentukan sepenuhnya
echo a$ b$
: output literal, ditentukan sepenuhnya
echo a$b
: perluasan parameter b
, ditentukan sepenuhnya
echo a$-b
: perluasan parameter khusus -
, ditentukan sepenuhnya
echo a$+b
: perilaku yang tidak ditentukan
echo "a$ b"
: perilaku yang tidak ditentukan
Untuk a $
di akhir kata, Anda diizinkan untuk mengandalkan perilaku dan itu harus diperlakukan secara harfiah dan diteruskan ke echo
perintah sebagai bagian dari argumennya. Itu adalah persyaratan kesesuaian pada shell.
$
mendapatkan makna khusus jika itu adalah karakter terakhir dalam sebuah kata?" Tidak ada makna khusus yang diberikan untuk$
; ini digunakan untuk memperkenalkan beberapa, tetapi berbeda, ekspansi, seperti ekspansi parameter${...}
, penggantian perintah$(...)
, dan ekspresi aritmatika$((...))
. Beberapa shell memperkenalkan konteks tambahan, sepertiksh
varian substitusi-perintahx=${ echo foo; echo bar;}
(yang berbeda dari standar$(...)
dengan tidak mengeksekusi perintah dalam subkulit).