Залежить від того, що ви маєте на увазі, що існує .
Є змінна , яка була оголошена , але не приписані існують ?
Є чи масив (або хеш) змінної , яка була призначена порожній список існує ?
Є змінна 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і bash4,4 або вище, є також:
if typeset -p var 2> /dev/null | grep -q '^'; then
echo '$var exists'
fi
Який буде повідомляти про змінні, які були встановлені або оголошені.
$somevarна значення / рядки , якщо змінна не існує:${somevar:=42}.