我遇到了一个git提交记录,其中使用了这个神奇的变量替换 cd ${0%/*}
来清理一些 readlink
和 dirname
命令。
它是如何被Bash解释的呢?
我遇到了一个git提交记录,其中使用了这个神奇的变量替换 cd ${0%/*}
来清理一些 readlink
和 dirname
命令。
它是如何被Bash解释的呢?
这里的%
被称为模式匹配运算符。
引自学习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
,即剥离掉“file”部分。
我理解您提出这个问题的原因,因为如果没有翻阅Bash书籍,要寻找答案会很困难。
假设$0
被设置为脚本的完全限定路径,则命令cd ${0%/*}
将目录更改为包含该脚本的目录。