Portatile per tutte le shell POSIX:
if [ -n "${foobar+1}" ]; then
echo "foobar is defined"
else
echo "foobar is not defined"
fi
Fare che ${foobar:+1}
se si vuole trattare foobar
allo stesso modo se è vuota o non definita. È inoltre possibile utilizzare ${foobar-}
per ottenere una stringa vuota quando foobar
non è definito e il valore di foobar
altrimenti (o inserire qualsiasi altro valore predefinito dopo il -
).
In ksh, se foobar
viene dichiarato ma non definito, come in typeset -a foobar
, quindi si ${foobar+1}
espande nella stringa vuota.
Zsh non ha variabili dichiarate ma non impostate: typeset -a foobar
crea un array vuoto.
In bash, le matrici si comportano in modo diverso e sorprendente. ${a+1}
si espande solo 1
se a
è un array non vuoto, ad es
typeset -a a; echo ${a+1} # prints nothing
e=(); echo ${e+1} # prints nothing!
f=(''); echo ${f+1} # prints 1
Lo stesso principio si applica agli array associativi: le variabili array vengono trattate come definite se hanno un insieme di indici non vuoto.
Un modo diverso e specifico per bash di verificare se è stata definita una variabile di qualsiasi tipo è verificare se è elencato in . Questo riporta array vuoti come definiti, diversamente , ma riporta variabili dichiarate ma non assegnate ( ) come indefinite.${!PREFIX*}
${foobar+1}
unset foobar; typeset -a foobar
case " ${!foobar*} " in
*" foobar "*) echo "foobar is defined";;
*) echo "foobar is not defined";;
esac
Ciò equivale a testare il valore di ritorno di typeset -p foobar
odeclare -p foobar
, tranne che typeset -p foobar
non riesce su variabili dichiarate ma non assegnate.
In bash, come in ksh, set -o nounset; typeset -a foobar; echo $foobar
genera un errore nel tentativo di espandere la variabile non definita foobar
. A differenza di ksh, set -o nounset; foobar=(); echo $foobar
(o echo "${foobar[@]}"
) attiva anche un errore.
Si noti che in tutte le situazioni qui descritte, si ${foobar+1}
espande nella stringa vuota se e solo se $foobar
causerebbe un errore in set -o nounset
.
-v
non è un'opzione pertest
, ma un operatore per le espressioni condizionali.