Действительно, предположение о значении параметра/переменной неустановленного в OP является неточным.
man bash
определяет переменную как особый тип параметра. Поэтому информация о переменных иногда находится в разделах, относящихся только к параметрам в целом.
Термины, описывающие характеристики и состояния относительно переменных из статьи Википедии о переменных .
unset string
:«Для каждого имени удалить соответствующую переменную…» [раздел «ВСТРОЕННЫЕ КОМАНДЫ ОБОЛОЧКИ», параграф «unset»] declare -p string
:«Опция -p будет отображать атрибуты и значения каждого имени». [Раздел ВСТРОЕННЫЕ КОМАНДЫ ОБОЛОЧКИ,«объявить»/«набрать» абзац] Вопрос должен был быть более точно сформулирован как :" Как можно отличить неинициализированную переменную bash от не -существующей? "
Ответ на это:
Не удивляйтесь тому, чтоunset
встроенная функция удаляет переменную из существования, а переменная в неустановленном состоянии в терминах bash является переменной, которая либо не была объявлена, либо была объявлена без стоимость.
Встроенная команда declare
действительно ведет себя непоследовательно в bash 4.3 по сравнению с bash 4.4 в отношении переменных, объявленных без значения:
$ # bash 4.3
$ unset string; declare string; declare -p string; echo $?
bash: declare: string: not found
1
$ # bash 4.4
$ unset string; declare string; declare -p string; echo $?
declare -- string
0
Таким образом, этот способ проверки одного используемого имени переменной не является универсальным, но работает в последних версиях bash.
К сожалению, раскрытие параметров не поможет провести различие между -несуществующими и неинициализированными переменными, так как обе ситуации охватываются одним и тем же неустановленным состоянием:
$ declare string; echo ${string-UNSET} # `string` exists, empty
UNSET
$ unset string; echo ${string-UNSET} # `string` does not exist
UNSET
К сожалению, также условный оператор -v
не помогает [руководство раздел CONDITIONAL EXPRESSIONS], он проверяет, было ли «переменной оболочки VARNAME установлено (присвоено значение )», без указания того, является ли VARNAME существовало в первую очередь:
$ unset string; ! [ -v string ] && echo "unused"
unused
$ declare string; ! [ -v string ] && echo "unused"
unused
Обсуждения, посвященные путанице в терминологии и особенностям bash в отношении состояний и значений параметров/переменных:
Происходит небольшая путаница:
i915
— это модуль/драйвер ядра для вашего iGPU, альтернатив ему нет xorg-x11-drv-intel
— это то, что требуется X.org
для связи с вашим драйвером ядра, по сути, это «драйвер» для сервера X.org
. my display is dull
Я не совсем понимаю, что вы хотите этим сказать.