这意味着shell脚本中的SCRIPTNAME =“$ {0 ## * /}”是什么意思?

时间:2012-03-06 19:38:08

标签: linux sh

此代码来自apache2服务启动脚本。

这是什么意思?

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

2 个答案:

答案 0 :(得分:3)

它找到正在运行的脚本的名称,删除其目录。例如,如果脚本为/etc/init.d/httpd,则会设置SCRIPTNAME=httpd

$0${0}是正在执行的脚本的名称。 ##运算符用于删除与模式*/匹配的任何前导字符串。 *是一个通配符,因此*/表示“任何字符串后跟正斜杠”。

这样做的效果是从$0删除任何前导目录名称,只留下脚本的名称。

来自 man bash

  

<强> $ {参数#字}
  的 $ {参数##字}

     

这个词被扩展为产生一个模式,就像路径名扩展一样。如果模式                 匹配参数值的开头,然后扩展的结果是                 使用最短匹配模式(“#”情况)或最长的参数扩展值                 匹配模式(“##”案例)已删除。如果参数为@*,则模式删除操作依次应用于每个位置参数,并且扩展是结果                 名单。如果参数是使用@*下标的数组变量,则模式删除操作依次应用于数组的每个成员,并且扩展是结果列表。

答案 1 :(得分:2)

左侧很简单:它分配给变量SCRIPTNAME。 右侧更复杂:

  • $0${0}是用于调用当前shell或脚本的名称。
  • ${VAR##pattern}是变量$VAR的值,其中最长的字符串与从前缀中删除的pattern匹配(最短使用一个#% } / %%删除结尾。

因此,您的表达式将删除用于调用脚本的名称的开头,包括最后一个斜杠。

顺便说一句,这就是程序basename的作用。