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