Portabel untuk semua kulit POSIX:
if [ -n "${foobar+1}" ]; then
echo "foobar is defined"
else
echo "foobar is not defined"
fi
Buat itu ${foobar:+1}
jika Anda ingin memperlakukan foobar
dengan cara yang sama apakah itu kosong atau tidak ditentukan. Anda juga dapat menggunakan ${foobar-}
untuk mendapatkan string kosong saat foobar
tidak terdefinisi dan nilai foobar
sebaliknya (atau masukkan nilai default lainnya setelah -
).
Dalam ksh, jika foobar
dideklarasikan tetapi tidak didefinisikan, seperti dalam typeset -a foobar
, kemudian ${foobar+1}
memperluas ke string kosong.
Zsh tidak memiliki variabel yang dideklarasikan tetapi tidak disetel: typeset -a foobar
membuat array kosong.
Dalam bash, array berperilaku dengan cara yang berbeda dan mengejutkan. ${a+1}
hanya mengembang ke 1
jika a
array tidak kosong, mis
typeset -a a; echo ${a+1} # prints nothing
e=(); echo ${e+1} # prints nothing!
f=(''); echo ${f+1} # prints 1
Prinsip yang sama berlaku untuk array asosiatif: variabel array diperlakukan sebagaimana didefinisikan jika mereka memiliki kumpulan indeks yang tidak kosong.
Cara berbeda, spesifik bash untuk menguji apakah variabel jenis apa pun telah ditetapkan adalah untuk memeriksa apakah variabel tersebut terdaftar . Laporan ini mengosongkan array seperti yang didefinisikan, tidak seperti , tetapi melaporkan variabel yang dideklarasikan tetapi tidak ditugaskan ( ) sebagai tidak terdefinisi.${!PREFIX*}
${foobar+1}
unset foobar; typeset -a foobar
case " ${!foobar*} " in
*" foobar "*) echo "foobar is defined";;
*) echo "foobar is not defined";;
esac
Ini sama dengan menguji nilai pengembalian typeset -p foobar
ataudeclare -p foobar
, kecuali yang typeset -p foobar
gagal pada variabel yang dideklarasikan tetapi tidak ditetapkan.
Di bash, seperti di ksh, set -o nounset; typeset -a foobar; echo $foobar
memicu kesalahan dalam upaya memperluas variabel yang tidak ditentukan foobar
. Tidak seperti di ksh, set -o nounset; foobar=(); echo $foobar
(atau echo "${foobar[@]}"
) juga memicu kesalahan.
Perhatikan bahwa dalam semua situasi yang dijelaskan di sini, ${foobar+1}
perluas string kosong jika dan hanya jika $foobar
akan menyebabkan kesalahan set -o nounset
.
-v
bukan pilihan untuktest
, tetapi operator untuk ekspresi kondisional.