it-swarm-id.com

Uji apakah variabel diset dalam bash saat menggunakan "set -o nounset"

Kode berikut keluar dengan kesalahan variabel tidak terikat. Bagaimana cara memperbaikinya, sementara masih menggunakan opsi nounset set -o?

#!/bin/bash

set -o nounset

if [ ! -z ${WHATEVER} ];
 then echo "yo"
fi

echo "whatever"
70
vinodkone
#!/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 ekspansi {parameter:-Word}, yang dapat Anda cari di man bash pada "Ekspansi Parameter".

67
Angelom

Anda perlu mengutip variabel jika Anda ingin mendapatkan hasil yang Anda harapkan:

check() {
    if [ -n "${WHATEVER-}" ]
    then
        echo 'not empty'
    Elif [ "${WHATEVER+defined}" = defined ]
    then
        echo 'empty but defined'
    else
        echo 'unset'
    fi
}

Uji:

$ unset WHATEVER
$ check
unset
$ WHATEVER=
$ check
empty but defined
$ WHATEVER='   '
$ check
not empty
26
l0b0

Asumsi:

$ echo $Shell
/bin/bash
$ /bin/bash --version | head -1
GNU bash, version 4.1.2(1)-release (x86_64-redhat-linux-gnu)
$ set -o nounset

Jika Anda ingin skrip non-interaktif mencetak kesalahan dan keluar jika suatu variabel nol atau tidak disetel:

$ [[ "${HOME:?}" ]]

$ [[ "${IAMUNBOUND:?}" ]]
bash: IAMUNBOUND: parameter null or not set

$ IAMNULL=""
$ [[ "${IAMNULL:?}" ]]
bash: IAMNULL: parameter null or not set

Jika Anda tidak ingin skrip keluar:

$ [[ "${HOME:-}" ]] || echo "Parameter null or not set."

$ [[ "${IAMUNBOUND:-}" ]] || echo "Parameter null or not set."
Parameter null or not set.

$ IAMNULL=""
$ [[ "${IAMUNNULL:-}" ]] || echo "Parameter null or not set."
Parameter null or not set.

Anda bahkan dapat menggunakan [ dan ] alih-alih [[ dan ]] di atas, tetapi yang terakhir lebih disukai di Bash.

Perhatikan apa yang dilakukan titik dua di atas. Dari docs :

Dengan kata lain, jika titik dua dimasukkan, operator menguji keberadaan parameter dan nilainya tidak nol; jika titik dua dihilangkan, operator hanya menguji keberadaan.

Tampaknya tidak perlu untuk -n atau -z.

Singkatnya, saya biasanya hanya menggunakan [[ "${VAR:?}" ]]. Per contohnya, ini mencetak kesalahan dan keluar jika variabel nol atau tidak disetel.

5
A-B-B

Bagaimana dengan oneliner?

[ -z "${VAR:-}" ] && echo "VAR is not set or is empty" || echo "VAR is set to $VAR"

-z memeriksa variabel kosong atau tidak disetel

4
NublaII

Kamu bisa memakai 

if [[ ${WHATEVER:+$WHATEVER} ]]; then

tapi

if [[ "${WHATEVER:+isset}" == "isset" ]]; then

mungkin lebih mudah dibaca.

2
Aleš Friedl

Meskipun ini bukan persis use case yang diminta di atas, saya telah menemukan bahwa jika Anda ingin menggunakan nounset (atau -u) perilaku default adalah yang Anda inginkan: untuk keluar bukan nol dengan pesan deskriptif.

Butuh waktu cukup lama bagi saya untuk menyadari bahwa saya pikir ini layak untuk dikirim sebagai solusi.

Jika yang Anda inginkan adalah menggemakan sesuatu yang lain saat keluar, atau melakukan pembersihan, Anda dapat menggunakan perangkap.

Operator :- mungkin adalah yang Anda inginkan sebaliknya.

0
Max Bileschi