我正在阅读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
我只是在寻找一些澄清$ {参数## Word}构造所做的事情,因为GNU的BASH参考手册对我来说尚不清楚。手册是这样定义的...
$ {参数#word} $ {参数## word}
与文件名扩展一样,该单词被扩展以产生模式(请参见文件名扩展)。如果图案与 参数的扩展值的开始,然后 扩展是参数的扩展值,最短 匹配模式("#"情况)或最长的匹配模式( " ##"案例)已删除。如果参数为"@"或"*",则删除模式 操作依次应用于每个位置参数,然后 扩展是结果列表。如果参数是数组变量 使用"@"或"*"订阅,应用了模式删除操作 依次对阵列的每个成员,扩展是 结果清单。
这是否意味着第一行将一个空字符串存储回SCRIPTNAME
,还是我离基地之外?
第一行将当前文件的basename
存储在SCRIPTNAME
中。$0
是(通常)当前脚本的名称。请参阅此相关问题以进行讨论。
第二行从名称中剥离K##
或S##
的前缀(假设/etc/init.d
链接命名约定。