Shell脚本:需要使用以前的文件夹而不是当前目录

有这样的结构:

/dir1/dir2/dir3/dir4/my_script.sh

在我的脚本中,有一点需要将dir3的完整path存储到一个variables中。 我知道这个作品:

CURRENT=`pwd` 

但是,如何储存前一个?

警告:我已经search了类似的问题,但都包括更改当前目录,这是我想要避免的。

编辑:我的意思是,当我运行my_script.sh,当前目录是/ dir1 / dir2 / dir3 / dir4 /我想存储在一个variables只是:/ dir1 / dir2 / dir3 /

如何使用dirname

 dirname $(pwd) /dir1/dir2/dir3 

将一个目录的值存储在一个变量中:

  x=$(dirname $(pwd)) echo $x /dir1/dir2/dir3 

您可以使用BASH字符串操作来获取任何完整路径的父级父目录路径:

 $> pwd /dir1/dir2/dir3/dir4 $> echo "${PWD%/[^/]*}" /dir1/dir2/dir3 

%/[^/]*$PWD (当前工作目录)中删除最后一个匹配模式/*

而不是在子shell中执行任何字符串操作或启动命令,可以在本地引用任何目录的父目录,或者如果您可以信任$PWD变量,则可以使用$PWD/..

当然,这只是让你使用父目录,它不会给你父目录的名称。 为此,你已经有了一些可用的选择。 还有一个,请继续阅读。

在bash中, cd builtin命令有两个选项, -P告诉cd使用物理目录结构遍历目录结构,因为它解析了符号链接, -L关于哪个手册页说这个:

  the -L option forces symbolic links to be followed by resolving the link after processing instances of .. in dir. If .. appears in dir, it is processed by removing the immediately previous pathname component from dir, back to a slash or the beginning of dir. 

所以…虽然以下几点可能会很好:

 parentdir="$(cd ..; pwd)" 

因此,您可以通过以下方式获取父目录:

 parentdir="$(cd -L ..; pwd)" 

请注意,尽管这涉及到目录更改,但更改实际上是在子shell( $(...) )内,所以不会影响您的脚本。

请注意,我说“有效”,因为严格来说, $(...)cdpwd都是内置的 bash,所以你实际上并没有产生新的shell。