这些是brew命令的摘录。
BREW_FILE_DIRECTORY=$(chdir "${0%/*}" && pwd -P)
export HOMEBREW_BREW_FILE="$BREW_FILE_DIRECTORY/${0##*/}"
${0%/*}
和${0##*/}
在shell中意味着什么?
答案 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
命令相同。