Shell脚本:需要使用当前目录的上级目录

3

有这样的结构:

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

在我的脚本中,有一个需要将dir3的完整路径存储到变量中的需求。 我知道这个方法可行:

CURRENT=`pwd`

但是,我该如何存储之前的目录呢?

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

编辑:我的意思是,当我运行 my_script.sh 时,当前目录是 /dir1/dir2/dir3/dir4/ 我想把它存储在一个变量中,只包含:/dir1/dir2/dir3/


你的意思是像 $OLDPWD 这样吗? - redneb
你是指父目录吗? - vmonteco
3个回答

2
可以使用dirname吗?
dirname $(pwd)
/dir1/dir2/dir3

要将上一级目录的值存储在变量中:

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

非常感谢!这是最快的方法(比进行字符串操作更好)。 - Joster
3
@Joster - 我很好奇,你为什么认为这种解决方案比字符串操作更好?我可以想到多个字符串操作更好的原因,但在这个方向上我无法想出。 (不过要给PS点赞,回答快速且准确!) - ghoti
@ghoti 也许在编译时间和效率方面,字符串操作更好,我不知道。我知道我可以通过字符串操作实现它(因为你几乎可以对字符串进行任何操作),但我正在寻找更清晰的解决方案,即你可以用肉眼理解的东西,例如,如果你将来忘记了语法。 - Joster

2
你可以使用BASH字符串操作来获取任何完整路径的父目录的父目录路径:
$> pwd
/dir1/dir2/dir3/dir4
$> echo "${PWD%/[^/]*}"
/dir1/dir2/dir3

%/[^/]*$PWD中移除最后一个匹配模式/*,该模式是当前工作目录。

(注:该语句描述的是Linux命令行中的操作)

1
是的,正确了,我获取到了祖先而不是父级。 - anubhava
1
另外,由于只使用了单个“%”,因此echo "${PWD%*/*}"同样有效。 - Sundeep

1

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

当然,这只是让您使用父目录,而不是给您父目录的名称。对于这个问题,您已经有了几个可用的替代方案。继续阅读以了解更多信息。

在bash中,cd内置命令有两个选项:-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。

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