Kode berikut keluar dengan kesalahan variabel tak terikat. Bagaimana cara memperbaikinya, saat masih menggunakan set -o
opsi kata benda?
#!/bin/bash
set -o nounset
if [ ! -z ${WHATEVER} ];
then echo "yo"
fi
echo "whatever"
#!/bin/bash
set -o nounset
VALUE=${WHATEVER:-}
if [ ! -z ${VALUE} ];
then echo "yo"
fi
echo "whatever"
Dalam kasus ini, VALUE
berakhir menjadi string kosong jika WHATEVER
tidak disetel. Kami menggunakan {parameter:-word}
perluasan, yang dapat Anda cari di man bash
bawah "Perluasan Parameter".
:-
memeriksa apakah variabel tidak disetel atau kosong. Jika Anda ingin memeriksa hanya apakah itu tidak diset, gunakan-
:VALUE=${WHATEVER-}
. Juga, cara yang lebih mudah dibaca untuk memeriksa apakah suatu variabel kosong:if [ "${WHATEVER+defined}" = defined ]; then echo defined; else echo undefined; fi
$WHATEVER
hanya berisi spasi - Lihat jawaban saya.! -z
" daripada hanya "-n
"?Anda perlu mengutip variabel jika ingin mendapatkan hasil yang diharapkan:
Uji:
sumber
"info bash"
,"${WHATEVER-}"
harus memiliki":"
(kolon) sebelum"-"
(dash) seperti:"${WHATEVER:-}"
, dan"${WHATEVER+defined}"
harus memiliki usus sebelum"+"
(plus) seperti:"${WHATEVER:+defined}"
. Bagi saya, itu bekerja dengan cara apa pun, dengan atau tanpa titik dua. Pada beberapa versi 'nix, ini mungkin tidak akan berfungsi tanpa menyertakan titik dua, jadi mungkin harus ditambahkan.-
,+
,:+
, dan:-
semua didukung. Yang pertama mendeteksi apakah variabel disetel , dan yang terakhir mendeteksi apakah itu disetel atau kosong . Dariman bash
: "Menghilangkan titik dua menghasilkan pengujian hanya untuk parameter yang tidak disetel."Bagaimana dengan oneliner?
-z
memeriksa variabel kosong atau tidak disetelsumber
-z
hanya memeriksa apakah parameter berikutnya kosong.-z
hanyalah argumen dari[
perintah. Ekspansi variabel terjadi sebelum[ -z
dapat melakukan apapun.Asumsi:
Jika Anda ingin skrip non-interaktif mencetak kesalahan dan keluar jika variabel null atau tidak disetel:
Jika Anda tidak ingin skrip keluar:
Anda bahkan dapat menggunakan
[
dan]
sebagai pengganti[[
dan yang]]
lebih baru, tetapi yang terakhir lebih disukai di Bash.Perhatikan apa yang dilakukan titik dua di atas. Dari dokumen :
Tampaknya tidak perlu
-n
atau-z
.Singkatnya, saya biasanya hanya menggunakan
[[ "${VAR:?}" ]]
. Per contoh, ini mencetak kesalahan dan keluar jika variabel null atau tidak disetel.sumber
Kamu bisa memakai
tapi
mungkin lebih mudah dibaca.
sumber
=
operator standar (POSIX) , bukan==
untuk membantu portabilitas, dan[
sebaliknya[[
jika memungkinkan.set -o nounset
yang khusus untuk pesta. Jika Anda meletakkan a#!/bin/bash
di bagian atas skrip Anda, sebenarnya yang terbaik adalah menggunakan penyempurnaan bash.Meskipun ini tidak persis kasus penggunaan meminta di atas, saya telah menemukan bahwa jika Anda ingin menggunakan
nounset
(atau-u
) perilaku default adalah salah satu yang ingin: untuk keluar nol dengan pesan deskriptif.Butuh waktu cukup lama bagi saya untuk menyadari hal ini sehingga saya pikir itu layak untuk diposting sebagai solusi.
Jika yang Anda inginkan hanyalah menggemakan hal lain saat keluar, atau melakukan pembersihan, Anda dapat menggunakan jebakan.
The
:-
operator adalah mungkin apa yang Anda inginkan sebaliknya.sumber