2

当我查看其他人的 shell 脚本时,我得到了这个问题。

我看到声明

APP_NAME="${0##*[\\/]}"

既然我找不到任何答案,那么这段代码的含义是什么?

4

1 回答 1

5

获取脚本名称本身是Shell Parameter Expansion ,没有路径

bash手册:

${parameter##word}

该词被扩展以产生一个模式并根据下面描述的规则进行匹配(请参阅模式匹配)。

如果模式匹配参数扩展值的开头,则扩展结果是具有最短匹配模式('#' 情况)或最长匹配模式('##' 情况)的参数扩展值删除。

模式匹配

*

匹配任何字符串,包括空字符串。当globstarshell 选项启用时,'*' 用于文件名扩展上下文

[…]

匹配任何一个封闭的字符。

解释

${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
于 2019-09-17T04:02:29.097 回答