Что это значит SCRIPTNAME = "$ {0 ## * /}" в сценарии оболочки? ` - PullRequest
3 голосов
/ 06 марта 2012

Этот код взят из скрипта запуска службы apache2.

Что это значит?

SCRIPTNAME="${0##*/}"

Ответы [ 2 ]

3 голосов
/ 06 марта 2012

Находит имя запускаемого скрипта, удаляя его каталог. Например, если скрипт имеет значение /etc/init.d/httpd, тогда будет установлено значение SCRIPTNAME=httpd.

.

$0 или ${0} - это имя выполняемого скрипта. Оператор ## используется для удаления любой ведущей строки, которая соответствует шаблону */. * является символом подстановки, поэтому */ означает «любая строка, за которой следует косая черта».

Результатом этого является удаление любых ведущих имен каталогов из $0, оставляя только имя сценария.

С человек Баш :

$ {параметр # слово}
$ {параметр ## слово}

Слово раскрывается для создания шаблона, как в раскрытии пути. Если шаблон соответствует началу значения параметра, тогда результатом расширения является расширенное значение параметра с кратчайшим подходящим шаблоном (регистр "#") или самым длинным соответствующий шаблон (случай "##") удален. Если параметр @ или *, операция удаления шаблона применяется к каждому позиционному параметру по очереди, и в результате получается расширение список. Если параметр является переменной массива, подписанной с @ или *, операция удаления шаблона применяется по очереди к каждому члену массива, и расширение является результирующим списком.

2 голосов
/ 06 марта 2012

Левая сторона проста: она присваивается переменной SCRIPTNAME. Правая сторона сложнее:

  • $0 или ${0} - это имя, используемое для вызова текущей оболочки или сценария.
  • ${VAR##pattern} - это значение переменной $VAR с самой длинной строкой, соответствующей pattern, удаленной из начала (используйте один # для самого короткого или % / %%, чтобы удалить конец.

Таким образом, ваше выражение удаляет начало имени, использованного для вызова скрипта, вплоть до последней косой черты, включая ее.

Кстати, это то, что делает программа basename.

...