Bash:检查相对路径是否存在

时间:2015-09-30 03:41:57

标签: bash shell

我正在编写一个shell脚本,它将目录作为唯一参数。在做其他事情之前,我需要检查目录是否存在。目录可以是绝对的也可以是相对的。我知道我可以使用

检查是否存在绝对目录(例如/ Users / keith / Documents / TestFolder)
if [ -d "$1"]; then
    # do something if the absolute directory exists
fi

但是,如果工作目录是/ Users / keith / Documents /并且我调用我的脚本并仅传递" TestFolder",那么即使TestFolder存在,此if语句中的测试也将评估为false在当前的工作目录中。

我尝试使用

将目录转换为绝对目录
abs_path=`cd "$1"; pwd`

然后使用上面的if语句测试绝对路径的存在。这工作正常(认识到" TestFolder"即使我传递的所有内容都作为参数存在),前提是传递给脚本的目录确实存在,但如果它不存在然后失败了。

我需要的是一种确定作为参数传递的目录是否存在的方法,无论它是作为绝对目录传递还是相对于用户的当前工作目录传递,并且它不会失败如果目录不存在。

我显然不是bash专家 - 非常感谢任何建议!

2 个答案:

答案 0 :(得分:3)

  

但是,如果工作目录是/ Users / keith / Documents /并且我调用我的脚本并仅传递“TestFolder”,则此if语句中的测试将评估为false,即使TestFolder存在于当前工作目录中

这不正确。如果当前工作目录中存在TestFolder,则[ -d TestFolder ]将成功。所以这里没有问题。

顺便说一下,如果你想规范化文件路径并且你有Gnu coreutils(如果你有Linux系统你可能会这样做),那么你可以使用:

readlink -f "$path"

readlink -e "$path"

不同之处在于,即使路径中的最后一个组件不存在,-f也会成功(因此如果路径是要创建的文件的合理名称,它将成功),而{{1只有在路径解析为现有文件或目录时才会成功。有关详细信息,请参阅-e

答案 1 :(得分:0)

一个简单的解决方案是...

  1. 关闭错误失败
  2. 尝试CD和pwd(可能会失败也可能不会失败)
  3. 打开失败错误(如果需要)
set +e
TESTPATH="$( cd ~/workspace/my-super-folder && pwd )"
set -e

一旦有了变量TESTPATH,就可以进行测试。如果路径在变量中,则目录存在。如果路径为空,则不会。

if [[ "${TESTPATH}" == "" ]]; then
  echo -e "FOLDER DOES NOT EXIST."
else
  echo -e "FOLDER EXISTS."
fi