【问题标题】:Bash: check if a relative path existsBash:检查是否存在相对路径
【发布时间】:2015-09-30 03:41:57
【问题描述】:

我正在编写一个将目录作为唯一参数的 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 专家 - 任何建议都将不胜感激!

【问题讨论】:

    标签: bash shell


    【解决方案1】:

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

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

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

    readlink -f "$path"
    

    readlink -e "$path"
    

    不同之处在于-f 会成功,即使路径中的最后一个组件不存在(因此如果路径是要创建的文件的合理名称,它将成功),而-e 只会如果路径解析为现有文件或目录,则成功。详情请见man readlink

    【讨论】:

    • 嗯,这有点尴尬……你说得对!它确实有效。我花了最后一个小时处理一个太远的目录,这就是它不起作用的原因。也许迟到编码不适合我。感谢您的帮助和阅读链接的推荐。看起来是未来使用的绝佳选择。
    【解决方案2】:

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

    1. 出错时关闭失败
    2. 尝试使用 CD 和密码(可能会失败,也可能不会失败)
    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
    

    【讨论】:

      猜你喜欢
      • 2020-05-08
      • 2020-02-28
      • 2011-11-25
      • 1970-01-01
      • 2010-12-16
      • 2014-03-09
      • 2011-10-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多