我遇到了git commit,它使用此魔术变量替换readlink
清除了一些dirname
和cd ${0%/*}
命令。
bash如何解释它?
答案 0 :(得分:11)
这里的%
称为模式匹配运算符。
引用学习Bash Shell 一书:
模式匹配运算符的经典用法是剥离路径名的组件,例如目录前缀和文件名后缀。考虑到这一点,这是一个显示所有运算符如何工作的示例。假设变量path
的值为/home/cam/book/long.file.name
;然后:
Expression Result Comments
${path##/*/} long.file.name ## takes out longest matched substring from the front
${path#/*/} cam/book/long.file.name # takes out shortest matched substring from the front
$path /home/cam/book/long.file.name
${path%.*} /home/cam/book/long.file % takes out shortest matched substring from the rear
${path%%.*} /home/cam/book/long %% takes out longest matched substring from the rear
这些很难记住,所以这里有一个方便的助记符设备:
在您的具体情况中,0
是我示例中path
的对应部分,因此您应该知道它。
如果$0
为/home/chj/myfile.txt
,则cd ${0%/*}
将展开为cd /home/chj
,即剥离“文件”部分。
我理解你提出这个问题的冲动,因为如果没有几个小时深入挖掘一本Bash书,就很难找到答案。
答案 1 :(得分:7)
命令cd ${0%/*}
将目录更改为包含脚本的目录,假设$0
设置为脚本的完全限定路径。