Присвоение целой пустой строки дает ноль - PullRequest
0 голосов
/ 11 апреля 2020

Я был удивлен, обнаружив следующее поведение в Bash:

declare -i a=
declare -i b
declare c=
echo $a
echo :$b:
echo :$c:

Вывод:

0

::

::

Следовательно, присвоение целой пустой строки дает ноль. Это где-то задокументировано?

Ответы [ 2 ]

1 голос
/ 11 апреля 2020

Обратите внимание, что инструкция declare не сбрасывает существующее значение, даже если добавлен флаг -i, существующее значение может стать недействительным.

Флаг -i влияет только на присвоение значения.

declare -- a='hello'
typeset -p a
declare -- a="hello"
echo "$a"
hello
declare -i a # no reset of value, but adds the -i flag
typeset -p a
declare -i a="hello"
echo "$a" # a still contains "hello" despite the -i flag
hello
a='world' # but a new value assignment will be filtered by the -i flag
typeset -p a
declare -i a="0"
echo "$a"
0

Поведение флага массива -a несколько отличается:

unset a
a=
typeset -p a # a contains an empty string
declare -- a=""
declare -a a # the -a flag converts the existing value to an entry even if the string is empty
typeset -p a
declare -a a=([0]="")

Подводя итог: флаг -i преобразует значение только во время присваивания. Флаг -a также преобразует значение во время объявления.

1 голос
/ 11 апреля 2020

Из раздела ARITHMETI C EVALUATION в man bash:

Значение переменной оценивается как арифметическое c выражение, когда на него ссылаются, или когда переменная, которая была с учетом целочисленного атрибута с помощью объявления -i присваивается значение. Значение NULL равно 0.

  • declare -i a=

Переменная a задается целочисленным атрибутом с помощью объявления -i и ей присваивается нулевое значение с оценкой 0.

  • declare -i b

Без присвоения, без арифметики c оценка, b еще пуста.

Обратите внимание, что declare -i - единственное, что представляет такое специальное поведение, как можно найти в описании объявления в SHILL BUILTIN COMMANDS. Таким образом, последний,

  • declare c=

сохраняет c пустым вместо преобразования его в 0.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...