当我查看其他人的 shell 脚本时,我得到了这个问题。
我看到声明
APP_NAME="${0##*[\\/]}"
既然我找不到任何答案,那么这段代码的含义是什么?
当我查看其他人的 shell 脚本时,我得到了这个问题。
我看到声明
APP_NAME="${0##*[\\/]}"
既然我找不到任何答案,那么这段代码的含义是什么?
见bash
手册:
${parameter##word}
该词被扩展以产生一个模式并根据下面描述的规则进行匹配(请参阅模式匹配)。
如果模式匹配参数扩展值的开头,则扩展结果是具有最短匹配模式('#' 情况)或最长匹配模式('##' 情况)的参数扩展值删除。
模式匹配:
*
匹配任何字符串,包括空字符串。当
globstar
shell 选项启用时,'*' 用于文件名扩展上下文
[…]
匹配任何一个封闭的字符。
${parameter<...>}
表达式意味着您可以扩展外壳参数。
即将${1:-"default_arg_value"}
扩展为"default_arg_value"
如果脚本在没有参数的情况下运行。
0
- 是第 0 个参数,即脚本名称本身
${0##<pattern>}
将删除最长匹配<pattern>
部分$0
*[\\/]
表示以\
or/
符号结尾的任何字符串。
因此,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