shell 中的“${0##*[\\/]}”是什么意思?
what's the meaning of "${0##*[\\/]}" in shell?
我在看别人的 shell 脚本时遇到了问题。
我看到声明了
APP_NAME="${0##*[\/]}"
既然找不到答案,请问这段代码是什么意思?
获取脚本名称本身是Shell Parameter Expansion,没有路径
参见 bash
手册:
${parameter##word}
The word is expanded to produce a pattern and matched according to the rules described below (see Pattern Matching).
If the pattern matches the beginning of the expanded value of parameter, then the result of the expansion is the expanded value of parameter with the shortest matching pattern (the ‘#’ case) or the longest matching pattern (the ‘##’ case) deleted.
*
Matches any string, including the null string. When the globstar
shell option is enabled, and ‘*’ is used in a filename expansion context
[…]
Matches any one of the enclosed characters.
说明
${parameter<...>}
表达式表示可以扩展shell个参数。
即如果脚本 运行 没有参数,${1:-"default_arg_value"}
将扩展为 "default_arg_value"
。
0
- 是第 0 个参数,即脚本名称本身
${0##<pattern>}
将删除与 [=23=]
的 <pattern>
部分的最长匹配
*[\/]
表示任何以\
或/
符号结尾的字符串。
因此,APP_NAME="${0##*[\/]}"
意味着 $APP_NAME
将由脚本名称本身初始化,没有路径。
样本
假设您有脚本 a/b/c/d/test.sh
:
#!/bin/bash
echo "${0##*[\/]}"
echo "${1#*[\/]}"
echo "${2##[\/]}"
$ bash a/b/c/d/test.sh /tmp/e /tmp/ff
> test.sh
> tmp/e
> tmp/ff
我在看别人的 shell 脚本时遇到了问题。
我看到声明了
APP_NAME="${0##*[\/]}"
既然找不到答案,请问这段代码是什么意思?
获取脚本名称本身是Shell Parameter Expansion,没有路径
参见 bash
手册:
${parameter##word}
The word is expanded to produce a pattern and matched according to the rules described below (see Pattern Matching).
If the pattern matches the beginning of the expanded value of parameter, then the result of the expansion is the expanded value of parameter with the shortest matching pattern (the ‘#’ case) or the longest matching pattern (the ‘##’ case) deleted.
*
Matches any string, including the null string. When the
globstar
shell option is enabled, and ‘*’ is used in a filename expansion context
[…]
Matches any one of the enclosed characters.
说明
${parameter<...>}
表达式表示可以扩展shell个参数。
即如果脚本 运行 没有参数,${1:-"default_arg_value"}
将扩展为 "default_arg_value"
。
0
- 是第 0 个参数,即脚本名称本身
${0##<pattern>}
将删除与 [=23=]
<pattern>
部分的最长匹配
*[\/]
表示任何以\
或/
符号结尾的字符串。
因此,APP_NAME="${0##*[\/]}"
意味着 $APP_NAME
将由脚本名称本身初始化,没有路径。
样本
假设您有脚本 a/b/c/d/test.sh
:
#!/bin/bash
echo "${0##*[\/]}"
echo "${1#*[\/]}"
echo "${2##[\/]}"
$ bash a/b/c/d/test.sh /tmp/e /tmp/ff
> test.sh
> tmp/e
> tmp/ff