如何拆分 $0 变量以在 bash 中查找目录和相对路径?

如何拆分 $0 变量以在 bash 中查找目录和相对路径?

$0 变量包含脚本的路径信息。

  • 如何将路径信息更改为绝对路径?我的意思是如何处理〜,.,..或类似的?
  • 如何将路径信息拆分为目录和文件名?

我可以使用 python/perl 来实现此目的,但如果可能的话我想使用 bash。

答案1

您不需要处理诸如 之类的事情~,shell 会为您完成这些工作。这就是为什么你可以传递~/filename给任何脚本或程序并且它可以工作 - 所有这些程序都不会处理~自己,你的 shell 将参数转换为/home/username/filename并将其传递给程序:

$ echo ~/filename
/home/mrozekma/filename

如果您需要一个规范的文件名(不包含诸如 之类的文件名..),请使用realpath(谢谢尼尔):

$ realpath ~/../filename
/home/filename

至于将路径拆分为目录名和文件名,请使用dirnamebasename

$ dirname /foo/bar/baz
/foo/bar

$ basename /foo/bar/baz
baz

答案2

使用迈克尔提到的目录名和基本名应该是获得你想要的东西的最安全的方法。

无论如何,如果你真的想用“仅限 bash 的工具”来做到这一点,你可以使用参数替换:

echo `basename $PWD`        # Basename of current working directory.
echo "${PWD##*/}"           # Basename of current working directory.
echo
echo `basename $0`          # Name of script.
echo $0                     # Name of script.
echo "${0##*/}"             # Name of script.
echo
filename=test.data
echo "${filename##*.}"      # data
                            # Extension of filename.

这个例子直接取自高级 Bash 脚本编写指南值得一看。

解释很简单:

${var#Pattern} 从 $var 中删除 $Pattern 中与 $var 前端匹配的最短部分。 ${var##Pattern} 从 $var 中删除 $Pattern 中与 $var 前端匹配的最长部分。

将模式视为某些正则表达式和###作为某种贪婪/非贪婪修饰符。

如果您必须对路径部分进行一些更复杂的提取,这可能会很有用。

答案3

realpath是一个告诉您真实路径的命令(删除..和符号链接等)

它是 FreeBSD 的标准。根据此讨论,它也适用于 Linux:

http://www.unix.com/shell-programming-scripting/89294-geting-real-path.html

该讨论还提供了一个 bash 解决方案:

$ bash -c "cd /foo/../bar/ ; pwd"

相关内容