从脚本中查找绝对路径

maa*_*nus 10 bash path

在脚本中,我进入了它$0的可能相对路径。为了将其转换为绝对值,我发现了这个我不明白的解决方案:

abspath=$(cd ${0%/*} && echo $PWD/${0##*/})
Run Code Online (Sandbox Code Playgroud)

我的问题是${0%/*}and里面的魔法${0##*/}。看起来前者提取目录名,后者提取文件名,我只是不明白如何。

l0b*_*0b0 10

肖恩有最简单的解决方案:readlink -f $0. 如果你想绝对确定处理奇怪的文件名,你可以使用这个:

absolute_path_x="$(readlink -fn -- "$0"; echo x)"
absolute_path="${absolute_path_x%x}"
Run Code Online (Sandbox Code Playgroud)

文档


dog*_*ane 8

定义:

${string%substring}$substring从 的末尾 删除最短的匹配项$string

${string##substring}$substring从 的开头删除最长的匹配项$string

你的例子:

abspath=$(cd ${0%/*} && echo $PWD/${0##*/})
Run Code Online (Sandbox Code Playgroud)

${0%/*} 删除最后一个斜杠后的所有内容,为您提供脚本的目录名称(可能是相对路径)。

${0##*/} 删除最后一个斜杠之前的所有内容,只为您提供脚本的名称。

因此,此命令更改为脚本目录并将当前工作目录(由 给出$PWD)和脚本名称连接起来,为您提供绝对路径。

要查看发生了什么,请尝试:

echo ${0%/*}
echo ${0##*/}
Run Code Online (Sandbox Code Playgroud)