" $ {0%/ *}"和" $ {0 ## * /}"在sh

时间:2015-06-22 12:30:48

标签: bash sh

这些是brew命令的摘录。

BREW_FILE_DIRECTORY=$(chdir "${0%/*}" && pwd -P)
export HOMEBREW_BREW_FILE="$BREW_FILE_DIRECTORY/${0##*/}"

${0%/*}${0##*/}在shell中意味着什么?

2 个答案:

答案 0 :(得分:9)

这些是shell parameter expansions

  • ${var%/*} - 删除最后一次出现/后的所有内容。
  • ${var##*/} - 删除最后一次出现的/

由于您在脚本中,$0引用脚本本身的名称。

总之,这将返回您正在运行的脚本的路径或名称。所以你有点干嘛:

BREW_FILE_DIRECTORY=$(chdir <path_of_script> && pwd -P)
export HOMEBREW_BREW_FILE="$BREW_FILE_DIRECTORY/<script_name>"

测试

$ r="hello/how/are/you"
$ echo ${r%/*}
hello/how/are
$ echo ${r##*/}
you

从上述链接(编辑后的版本缩短):

  

<强> $ {参数##字}

     

这个词被扩展为产生一个模式,就像文件名一样   扩张。如果模式与扩展值的开头匹配   参数,然后扩展的结果是扩展值   具有最长匹配模式的参数('##'情况)   删除。如果参数为'@'或'*',则模式删除操作为   依次应用于每个位置参数,并且扩展是   结果清单。

     

<强> $ {参数%字}

     

这个词被扩展为产生一个模式,就像文件名一样   扩张。如果模式匹配展开的尾部   参数的值,那么扩展的结果就是值   删除了最短匹配模式('%'的情况)的参数。   如果参数为“@”或“*”,则应用模式删除操作   依次对每个位置参数进行扩展   结果清单。

关于$0本身,请参阅Bash reference manual -> 6.1 Invoking bash

  

如果参数处理后参数仍然存在,则-c和   提供了-s选项,假设第一个参数是   包含shell命令的文件的名称(请参阅Shell脚本)。什么时候   以这种方式调用Bash,$ 0设置为文件名,   并且位置参数设置为其余参数。巴什   从该文件中读取并执行命令,然后退出。

答案 1 :(得分:3)

这些是字符串操作操作。您可以参考此document

${string%substring}  # Deletes shortest match of $substring from back of $string.
${string##substring} # Deletes longest match of $substring from front of $string.

有了这个,我们可以解释运营商在你的代码中做了什么。

${0%/*}

假设$ 0是文件名,它将为您提供它所在的目录。它的工作方式与dirname命令相同。

${0##*/}

假设$ 0是文件名,它将为您提供没有前导路径的文件名。它的工作方式与basename命令相同。