什么'cd $ {0%/ *}'在bash中意味着什么?

时间:2015-03-06 07:50:01

标签: bash

我遇到了git commit,它使用此魔术变量替换readlink清除了一些dirnamecd ${0%/*}命令。

bash如何解释它?

2 个答案:

答案 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设置为脚本的完全限定路径。