Создает ли `declare -a A` пустой массив `A` в Bash?

Dado que tiene dos monitores y no necesita espacio de trabajo, sugeriré desactivar los atajos para "Mover al espacio de trabajo arriba/abajo":

  1. Configuración > Dispositivos > Teclado
  2. buscar "espacio de trabajo"
  3. haga clic en "Mover al espacio de trabajo de arriba", presione Retroceso, presione Establecer, listo.

De hecho, deshabilité todos los accesos directos relacionados con el espacio de trabajo...

7
28.05.2019, 14:14
1 ответ

Это зависит от того, была ли соответствующая переменная уже объявлена ​​ранее в текущей области видимости (верхнем -уровне, также известном как глобальная или текущая функция ).

Если она не была объявлена ​​в текущей области видимости (и имейте в виду, что в области видимости верхнего -уровня переменная может быть объявлена ​​( и назначена )путем импорта из среда ), затем он объявляет его (делает его локальным для функции, когда он находится в области действия функции ), присваивая ему тип, но не инициализируя его, даже в пустой список(declare -p aпоказывает declare -a a, а не declare -a a=(), как если бы вы объявили и/или присвоили его с помощьюa=()).

Если он уже был объявлен в текущей области видимости (, например, потому что он был импортирован как скалярная переменная из среды в глобальной области видимости ), тогда declare -a aпопытается преобразовать его в массив.

Если ранее он был скаляром, то он становится ([0]=value-of-the-variable)массивом. Если это уже был массив, он остается нетронутым. Если это был ассоциативный массив, произойдет сбой с ошибкой cannot convert associative to indexed array.

Обратите внимание, что declare aне будет преобразовывать массив или хэш в скаляр. bashвсе равно не сможет преобразовать хэш/массив в скаляр. Вы можете использовать declare +aA aдля принудительного скаляра (, который завершится с ошибкой, если переменная ранее была хэшем/массивом в текущей области ).

В вашем случае переменная, вероятно, еще не была объявлена ​​в текущей области видимости,поэтому он оказался объявленным, но не назначенным, что объясняет, почему попытка его расширения не удалась в set -u.

Это различие между двумя объявленными и назначенными / наборами состояниями переменной не относится к bash. В POSIX shвы также можете exportсоздать переменную или сделать ее readonly, не присваивая ей значения.

$ sh -uc 'unset -v var; readonly var; : "$var"'
sh: 1: var: parameter not set

Обратите внимание, что unsetодновременно сбрасывает и отменяет объявление переменной. В bash, mkshи yashон может восстановить переменную из внешней области.

В zsh, за исключением shэмуляции, использование typesetдля объявления переменной и установки ее в пустое значение, если она еще не была установлена ​​или была установлена, но из другого типа (скаляр против массива против ассоциативного массива ).

14
27.01.2020, 20:16

Теги

Похожие вопросы