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 foobarten sam sposób, czy jest pusty, czy nie zdefiniowany. Możesz także użyć, ${foobar-}aby uzyskać pusty ciąg znaków, gdy foobarjest niezdefiniowany, i wartość w foobarprzeciwnym razie (lub wstawić dowolną inną wartość domyślną po -).
W ksh, jeśli foobarjest 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 foobartworzy pustą tablicę.
W bash tablice zachowują się w inny i zaskakujący sposób. ${a+1}rozwija się tylko do 1jeśli ajest 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 foobarzawodzi w przypadku zadeklarowanych, ale nieprzypisanych zmiennych.
W bash, podobnie jak w ksh, set -o nounset; typeset -a foobar; echo $foobarwyzwala 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 $foobarspowodowałby błąd pod set -o nounset.
-vnie jest opcjątest, ale jest operatorem wyrażeń warunkowych.