Почему $ {## параметр} всегда возвращает 0?

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

Всего 2 ответа


Укороченная версия

Вы можете выразить ${##parameter} как:

x=$#
${x#parameter}

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

x=$#
${x##parameter}

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


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

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

$ 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 ## ...} с переменной, фигурными скобками и хеш-символом в bash?


Есть идеи?

10000