Przenośny dla wszystkich powłok POSIX:
if [ -n "${foobar+1}" ]; then
echo "foobar is defined"
else
echo "foobar is not defined"
fi
Zrób to, ${foobar:+1}
jeśli chcesz traktować w foobar
ten sam sposób, czy jest pusty, czy nie zdefiniowany. Możesz także użyć, ${foobar-}
aby uzyskać pusty ciąg znaków, gdy foobar
jest niezdefiniowany, i wartość w foobar
przeciwnym razie (lub wstawić dowolną inną wartość domyślną po -
).
W ksh, jeśli foobar
jest zadeklarowane, ale nie zdefiniowane, jak w typeset -a foobar
, to ${foobar+1}
rozwija się do pustego ciągu.
Zsh nie ma zmiennych, które zostały zadeklarowane, ale nie zostały ustawione: typeset -a foobar
tworzy pustą tablicę.
W bash tablice zachowują się w inny i zaskakujący sposób. ${a+1}
rozwija się tylko do 1
jeśli a
jest niepustą tablicą, np
typeset -a a; echo ${a+1} # prints nothing
e=(); echo ${e+1} # prints nothing!
f=(''); echo ${f+1} # prints 1
Ta sama zasada dotyczy tablic asocjacyjnych: zmienne tablicowe są traktowane jak zdefiniowane, jeśli mają niepusty zbiór indeksów.
Innym, specyficznym dla basha sposobem testowania, czy zmienna dowolnego typu została zdefiniowana, jest sprawdzenie, czy jest wymieniona w . Raportuje puste tablice zgodnie z definicją, w przeciwieństwie do${!PREFIX*}
${foobar+1}
, ale zgłasza zmienne zadeklarowane, ale nieprzypisane ( unset foobar; typeset -a foobar
) jako niezdefiniowane.
case " ${!foobar*} " in
*" foobar "*) echo "foobar is defined";;
*) echo "foobar is not defined";;
esac
Jest to równoważne z testowaniem wartości zwracanejtypeset -p foobar
lubdeclare -p foobar
, z tym wyjątkiem, że typeset -p foobar
zawodzi w przypadku zadeklarowanych, ale nieprzypisanych zmiennych.
W bash, podobnie jak w ksh, set -o nounset; typeset -a foobar; echo $foobar
wyzwala błąd przy próbie rozwinięcia niezdefiniowanej zmiennej foobar
. W przeciwieństwie do ksh set -o nounset; foobar=(); echo $foobar
(lub echo "${foobar[@]}"
) również powoduje błąd.
Zauważ, że we wszystkich opisanych tutaj sytuacjach, ${foobar+1}
rozwija się do pustego ciągu, jeśli i tylko jeśli $foobar
spowodowałby błąd pod set -o nounset
.
-v
nie jest opcjątest
, ale jest operatorem wyrażeń warunkowych.