Залежить від того, що ви маєте на увазі, що існує .
Є змінна , яка була оголошена , але не приписані існують ?
Є чи масив (або хеш) змінної , яка була призначена порожній список існує ?
Є змінна nameref посилається на змінну , яка в даний час не призначається існує ?
Чи вважаєте ви $-
, $#
, $1
змінні? (POSIX не робить).
Канонічним способом в ободах Борна є:
if [ -n "${var+set}" ]; then
echo '$var was set'
fi
Це працює для скалярних змінних та інших параметрів, щоб визначити, чи змінній було присвоєно значення (порожнє чи ні, автоматично, з оточення read
, призначення for
чи іншого).
Для оболонок, які мають typeset
або declare
команду, вони не звітуватимуть як встановлені змінні, які були оголошені, але не призначені, крім в zsh
.
Для оболонок, які підтримують масиви, за винятком yash
і zsh
які не повідомлятимуться як встановлені змінні масиву, якщо не встановлено елемент індексу 0.
Для bash
(але ні, ksh93
ні zsh
) для змінних асоціативного масиву типу , які не повідомили б про них як встановлені, якщо не встановлено їх елемент ключа "0".
Для ksh93
і bash
для змінних типу nameref це істинно повертається лише тоді, коли змінна, на яку посилається nameref, сама вважається встановленою .
Для ksh
, zsh
і bash
, потенційно кращий підхід може бути:
if ((${#var[@]})); then
echo '$var (or the variable it references for namerefs) or any of its elements for array/hashes has been set'
fi
Для ksh93
, zsh
і bash
4,4 або вище, є також:
if typeset -p var 2> /dev/null | grep -q '^'; then
echo '$var exists'
fi
Який буде повідомляти про змінні, які були встановлені або оголошені.
$somevar
на значення / рядки , якщо змінна не існує:${somevar:=42}
.