我正在编写一个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专家 - 非常感谢任何建议!
答案 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)
一个简单的解决方案是...
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