Зависит от того, что вы подразумеваете под существующим .
Есть ли переменная , которая была объявлена , но не приписанные существуют ?
Есть ли массив (или хеш) переменной , которая была назначена пустой список существует ?
Есть ли переменная nameref ссылающийся на переменную , которая в настоящее время не назначается существует ?
Считаете ли вы $-, $#, $1переменные? (POSIX нет).
В борновоподобных оболочках канонический путь таков:
if [ -n "${var+set}" ]; then
echo '$var was set'
fi
Это работает для скалярных переменных и других параметров , чтобы сказать , если переменная было присвоено значение (пустой или нет, автоматически, из среды, assigments, read, forили другие).
Для оболочек, которые имеют команду typesetили declare, они не будут сообщать как установленные переменные, которые были объявлены, но не назначены, кроме как в zsh.
Для оболочек , которые поддерживают массивы, за исключением , yashи zshчто не будет сообщать , как набор переменного массива , если элемент Indice-не был установлен.
Для bash(но не , ksh93ни zsh), для переменных типа ассоциативного массива , что бы не сообщать о них , как набор , если их элемент ключ «0» было установлено.
Для ksh93и bashдля переменных типа nameref это возвращает true, только если переменная, на которую ссылается 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}.