Saya pikir jawaban Anda setelah tersirat (jika tidak dinyatakan) oleh Vinko 's jawaban , meskipun tidak terbilang sederhana. Untuk membedakan apakah VAR diatur tetapi kosong atau tidak disetel, Anda dapat menggunakan:
if [ -z "${VAR+xxx}" ]; then echo VAR is not set at all; fi
if [ -z "$VAR" ] && [ "${VAR+xxx}" = "xxx" ]; then echo VAR is set but empty; fi
Anda mungkin dapat menggabungkan dua tes pada baris kedua menjadi satu dengan:
if [ -z "$VAR" -a "${VAR+xxx}" = "xxx" ]; then echo VAR is set but empty; fi
Namun, jika Anda membaca dokumentasi untuk Autoconf, Anda akan menemukan bahwa mereka tidak merekomendasikan menggabungkan istilah dengan ' -a
' dan merekomendasikan menggunakan tes sederhana terpisah dikombinasikan dengan &&
. Saya belum menemukan sistem di mana ada masalah; itu tidak berarti mereka tidak pernah ada (tetapi mereka mungkin sangat langka hari ini, bahkan jika mereka tidak langka di masa lalu).
Anda dapat menemukan detailnya, dan ekspansi parameter shell terkait lainnya , test
atau[
perintah dan ekspresi kondisional dalam manual Bash.
Baru-baru ini saya ditanya melalui email tentang jawaban ini dengan pertanyaan:
Anda menggunakan dua tes, dan saya mengerti yang kedua dengan baik, tetapi bukan yang pertama. Lebih tepatnya saya tidak mengerti perlunya ekspansi variabel
if [ -z "${VAR+xxx}" ]; then echo VAR is not set at all; fi
Bukankah ini akan mencapai hal yang sama?
if [ -z "${VAR}" ]; then echo VAR is not set at all; fi
Pertanyaan wajar - jawabannya adalah 'Tidak, alternatif Anda yang lebih sederhana tidak melakukan hal yang sama'.
Misalkan saya menulis ini sebelum ujian Anda:
VAR=
Tes Anda akan mengatakan "VAR tidak disetel sama sekali", tetapi tes saya akan mengatakan (dengan implikasi karena tidak menggemakan apa pun) "VAR diatur tetapi nilainya mungkin kosong". Coba skrip ini:
(
unset VAR
if [ -z "${VAR+xxx}" ]; then echo JL:1 VAR is not set at all; fi
if [ -z "${VAR}" ]; then echo MP:1 VAR is not set at all; fi
VAR=
if [ -z "${VAR+xxx}" ]; then echo JL:2 VAR is not set at all; fi
if [ -z "${VAR}" ]; then echo MP:2 VAR is not set at all; fi
)
Outputnya adalah:
JL:1 VAR is not set at all
MP:1 VAR is not set at all
MP:2 VAR is not set at all
Dalam pasangan tes kedua, variabel diatur, tetapi diatur ke nilai kosong. Ini adalah perbedaan yang dibuat oleh ${VAR=value}
dan ${VAR:=value}
notasi. Ditto untuk ${VAR-value}
dan ${VAR:-value}
, dan ${VAR+value}
dan ${VAR:+value}
, dan seterusnya.
Sebagai Gili menunjukkan dalam bukunya jawaban , jika Anda menjalankan bash
dengan set -o nounset
pilihan, maka jawaban dasar di atas gagal dengan unbound variable
. Itu mudah diatasi:
if [ -z "${VAR+xxx}" ]; then echo VAR is not set at all; fi
if [ -z "${VAR-}" ] && [ "${VAR+xxx}" = "xxx" ]; then echo VAR is set but empty; fi
Atau Anda dapat membatalkan set -o nounset
opsi dengan set +u
( set -u
setara dengan set -o nounset
).