2015-05-04 3 views
3

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

SCRIPTNAME="${0##*/}" 
SCRIPTNAME="${SCRIPTNAME##[KS][0-9][0-9]}" 
if [ -n "$APACHE_CONFDIR" ] ; then 
    if [ "${APACHE_CONFDIR##/etc/apache2-}" != "${APACHE_CONFDIR}" ] ; then 
      DIR_SUFFIX="${APACHE_CONFDIR##/etc/apache2-}" 
    else 
      DIR_SUFFIX= 
    fi 
elif [ "${SCRIPTNAME##apache2-}" != "$SCRIPTNAME" ] ; then 
    DIR_SUFFIX="-${SCRIPTNAME##apache2-}" 
    APACHE_CONFDIR=/etc/apache2$DIR_SUFFIX 
else 
    DIR_SUFFIX= 
    APACHE_CONFDIR=/etc/apache2 
fi 

Я просто ищу некоторые разъяснения относительно того, что $ {параметр ## слово} конструкт это потому, что ссылка Баш руководство от gnu не ясно для меня. Руководство определяет это так ...

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

слово раскрывается, чтобы получить шаблон так же, как в расширении имени файла (см Filename Expansion) , Если шаблон соответствует началу расширенного значения параметра, то результатом расширения является расширенное значение параметра с кратчайшим совпадающим шаблоном (случай «#») или самым длинным совпадающим шаблоном ( ' # ') удалены. Если параметр равен '@' или '*', операция по удалению применяется к каждому позиционному параметру по очереди, а расширение - это результирующий список. Если параметр представляет собой переменную массива с индексом «@» или «*», операция удаления шаблона применяется поочередно к каждому члену массива, а расширение - это итоговый список .

Это означает, что первая строка хранит пустую строку обратно в SCRIPTNAME или я просто от основания?

+0

Специальная обработка '*' в части документации '$ {параметр ## слово} ', который вы выделяете, ссылается на' * 'как' parameter'. Однако в 'SCRIPTNAME = '$ {0 ## * /}" '' '' 'отображается как часть' word'. – John1024

+2

Для запись, это расширение параметра не является расширением GNU - это POSIX. (Хотя у Bash также есть некоторые пользовательские формы расширений.) Более каноническое определение можно найти в [opengroup] (http://pubs.opengroup.org/ onlinepubs/009695399/утилиты/xcu_chap02.html # tag_02_06_02). – kojiro

ответ

2

В первой строке хранится basename текущего файла в SCRIPTNAME. $0 - это (как правило) имя текущего скрипта. См. this Связанный с этим вопрос для обсуждения.

Вторая строка затем раздевает префикс K## или S## от имени (при условии /etc/init.d ссылок именования.

Смежные вопросы