Saya melihat skrip yang memiliki:
if [ "${PS1-}" ]; then
Trailing itu -
sedikit mengganggu saya karena sepertinya tidak ada sintaks standar Posix atau Bash. Apakah ini sintaks yang misterius yang telah ada selamanya, atau apakah itu salah ketik? Referensi ke standar / dokumen akan dihargai.
Biasanya saya akan kode itu:
if [ "$PS1" ]; then
Mana yang lebih benar atau apakah ada perbedaan di antara mereka?
zsh
adalah satu-satunya cangkang yang saya tahu yang menyebutkan varian bebas-usus secara eksplisit, bukan hanya membuat catatan tentang apa yang dilakukan penghilangan usus besar.Ekspansi variabel
${parameter:-word}
akan menggunakan nilai$parameter
jika disetel dan non-null (bukan string kosong), jika tidak maka akan menggunakan stringword
.Menghilangkan
:
tidak akan menguji apakah nilainya kosong, hanya apakah itu tidak disetel atau tidak.Ini berarti bahwa
${PS1-}
akan memperluas ke nilai$PS1
jika diatur, tetapi ke string kosong jika itu kosong atau tidak disetel. Dalam hal ini, ini adalah persis sama seperti${PS1:-}
sebagai string setelah-
juga kosong.Perbedaan antara
"${PS1-}"
dan"$PS1"
halus, seperti yang dicatat oleh @Rakesh Sharma: keduanya akan diperluas ke nilai$PS1
, atau ke string kosong jika tidak disetel. Pengecualiannya adalah ketikaset -u
sedang aktif, dalam hal ini memperluas variabel yang tidak disetel akan menyebabkan kesalahan . Nilai default (kosong) yang diatur oleh"${PS1-}"
circumvents this, memperluas unsetPS1
ke string kosong tanpa kesalahan.Ini adalah sintaks standar ( berasal dari shell Bourne di akhir 70-an ), seperti halnya beberapa ekspansi serupa lainnya.
sumber
"$PS1"
, karena jikaPS1
kosong, itu kosong, dan kutipan menjaga kata dari menghilang sepenuhnya.set -u
tidak berlaku. Ketika opsi nounset diaktifkan, maka "$ PS1" => memberikan kesalahan. "$ {PS-}" tidak akan.${parameter:-word}
akan menggunakan nilai$parameter
jika NON-NULL. Dalam semua kasus lain (artinya: setel tetapi NULL atau tidak disetel) itu akan digunakanword
. Kata-kata Anda:if its set or null
set AND nonnull
= = gunakan itu sendiri. Selain itu, (set but NULL OR unset
) => gunakan kata.Sintaksnya:
dan bentuk khusus:
adalah sintaks yang valid dalam shell POSIX , berarti menggunakan nilai default
word
jikaparameter
tidak disetel atau null.Biasanya, dengan
word
kosong, maka:dan:
atau:
adalah setara.
Tetapi di bawah pengaruh
set -u
, semua variabel yang tidak disetel menyebabkan shell dihentikan.${parameter-}
digunakan untuk memotong aturan ketat itu. Ini berfungsi dalam kedua kasus jadi ya, itu cara yang lebih benar.sumber