此代码来自apache2服务启动脚本。
这是什么意思?
SCRIPTNAME="${0##*/}"
答案 0 :(得分:3)
它找到正在运行的脚本的名称,删除其目录。例如,如果脚本为/etc/init.d/httpd
,则会设置SCRIPTNAME=httpd
。
$0
或${0}
是正在执行的脚本的名称。 ##
运算符用于删除与模式*/
匹配的任何前导字符串。 *
是一个通配符,因此*/
表示“任何字符串后跟正斜杠”。
这样做的效果是从$0
删除任何前导目录名称,只留下脚本的名称。
来自 man bash :
<强> $ {参数#字} 强>
的 $ {参数##字} 强>这个词被扩展为产生一个模式,就像路径名扩展一样。如果模式 匹配参数值的开头,然后扩展的结果是 使用最短匹配模式(“#”情况)或最长的参数扩展值 匹配模式(“##”案例)已删除。如果参数为
@
或*
,则模式删除操作依次应用于每个位置参数,并且扩展是结果 名单。如果参数是使用@
或*
下标的数组变量,则模式删除操作依次应用于数组的每个成员,并且扩展是结果列表。
答案 1 :(得分:2)
左侧很简单:它分配给变量SCRIPTNAME
。
右侧更复杂:
$0
或${0}
是用于调用当前shell或脚本的名称。${VAR##pattern}
是变量$VAR
的值,其中最长的字符串与从前缀中删除的pattern
匹配(最短使用一个#
或%
} / %%
删除结尾。因此,您的表达式将删除用于调用脚本的名称的开头,包括最后一个斜杠。
顺便说一句,这就是程序basename
的作用。