shell 脚本中的 ${0%/*} 有什么作用?

s.o*_*ene 18 command-line sh

对不起,如果这是一个愚蠢的问题,但我没有成功搜索它。

第二行到底是做什么的?:

#!/bin/sh
cd ${0%/*} || exit 1
Run Code Online (Sandbox Code Playgroud)

我知道第一个是shebang,第二个尝试更改目录,但令人困惑的部分是${0%/*}.

你能解释一下第二行吗?

And*_*ini 30

${0}是脚本的第一个参数,即脚本名称或路径。如果您将脚本作为 启动path/to/script.sh${0}则将正是该字符串:path/to/script.sh

%/*部分修改 的值${0}。这意味着:取所有字符直到/后跟文件名。在上面的例子中,${0%/*}将是path/to.

您可以在 shell 上看到它的运行情况:

$ x=path/to/script.sh
$ echo "${x%/*}"
path/to
Run Code Online (Sandbox Code Playgroud)

Sh 支持许多其他类型的“参数替换”。例如,这里是如何使用文件名而不是路径:

$ echo "${x##*/}"
script.sh
Run Code Online (Sandbox Code Playgroud)

一般来说,%%%strip后缀,while###strip前缀。您可以阅读有关参数替换的更多信息。

  • 很高兴提到该构造在手册中被记录为“删除匹配的前缀/后缀模式”。还有一个很好的方式来记住哪个是 # 是 shift 3 (*left* of $),% 是 shift 5 (*right* of $),至少在美国键盘上是这样。 (3认同)
  • 这个“|| exit 1”似乎是不必要的:如果更改dir $? 等于 1。 (2认同)