Почему $ {## параметр} всегда возвращает 0? - PullRequest
2 голосов
/ 09 февраля 2020

Предположим, что parameter=value является внутренней переменной в bash. Когда я пытаюсь ${#parameter} в bash, он возвращает 5. Но когда я пытаюсь, например, ${##parameter} или ${###parameter}, он всегда возвращает 0 взамен. Почему не сказано, что это ошибка замещения, как в других случаях?

Ответы [ 2 ]

3 голосов
/ 09 февраля 2020

Короткая версия

Вы можете express ${##parameter} как:

x=$#
${x#parameter}

и ${###parameter} как:

x=$#
${x##parameter}

Вы выполняете удаление префикса для $# (количество аргументов, переданных скрипту / функции).


Более длинная версия

Если parameter имеет какое-то особое значение, оно, скорее всего, будет указывать c для вашей среды.

$ echo \""${parameter}"\"
""

или даже:

$ set -u
$ echo \""${parameter}"\"
bash: parameter: unbound variable

Теперь, не обращая внимания, быстро рассмотрим документы :

${#parameter}

Подставляется длина в символах расширенного значения параметра.

То есть с переменной parameter не задано:

$ echo ${#parameter}
0

или с помощью set -u:

$ echo ${#parameter}
bash: parameter: unbound variable

Дополнительно # изменено значение на Удалите соответствующий шаблон префикса. с помощью : ${parameter#word} или ${parameter##word} синтаксис для ${#}, то есть количество аргументов, переданных скрипту / функции. Хороший способ увидеть и понять это поведение будет:

$ f() { echo -n "$# " ; echo ${##parameter}; }
$ f
0 0
$ f a b c
3 3

Как вы видите в первом вызове ${#} было 0 и (и попытка удалить префикс "parameter" на самом деле ничего не делает) и вторым значением вызова ${#} является 3.

Удаление префикса, разница между # и ## заключается в том, что при сопоставлении шаблонов вне зависимости от того, удаляется ли короткое или самое длинное соответствие.

0 голосов
/ 09 февраля 2020

Потому что ## - это специальный оператор, который удаляет префикс. Смотрите, например, здесь: Что означает синтаксис $ {0 ## ...} с переменной, фигурные скобки и символ ha sh в bash?

...