在Bash中,'cd ${0%/*}'是什么意思?

13

我遇到了一个git提交记录,其中使用了这个神奇的变量替换 cd ${0%/*} 来清理一些 readlinkdirname 命令。

它是如何被Bash解释的呢?


1
https://dev59.com/QGEh5IYBdhLWcg3wbjLc - Etan Reisner
http://www.gnu.org/software/bash/manual/bashref.html#Shell-Parameter-Expansion - Etan Reisner
顺带一提,http://stackoverflow.com/questions/4685615/search-engine-for-special-characters 对我没有帮助。我相信在StackOverflow上有重复的问题,但我找不到它们。 - tripleee
(但是执行“man bash”并搜索百分号符号将快速找到相关文档。) - tripleee
2个回答

17

这里的%被称为模式匹配运算符。

引自学习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.txtcd ${0%/*}将扩展为cd /home/chj,即剥离掉“file”部分。

我理解您提出这个问题的原因,因为如果没有翻阅Bash书籍,要寻找答案会很困难。


10

假设$0被设置为脚本的完全限定路径,则命令cd ${0%/*}将目录更改为包含该脚本的目录。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接