我正在编写一个将目录作为唯一参数的 shell 脚本。我需要在做任何其他事情之前检查该目录是否存在。目录可以是绝对的,也可以是相对的。我知道我可以使用
if [ -d "$1"]; then
# do something if the absolute directory exists
fi
Run Code Online (Sandbox Code Playgroud)
但是,如果工作目录是 /Users/keith/Documents/ 并且我调用我的脚本并只传递“TestFolder”,那么这个 if 语句中的测试将评估为 false,即使 TestFolder 存在于当前工作目录中。
我曾尝试使用将目录转换为绝对目录
abs_path=`cd "$1"; pwd`
Run Code Online (Sandbox Code Playgroud)
然后使用上面的 if 语句测试绝对路径的存在。如果传递给脚本的目录确实存在,则可以正常工作(即使我将其作为参数传递,也可以识别“TestFolder”存在),但如果不存在,则此操作将失败。
我需要的是一种确定作为参数传递的目录是否存在的方法,无论它是作为绝对目录传递还是相对于用户当前工作目录的目录传递,并且如果目录不存在则不会失败.
我显然不是 bash 专家 - 任何建议将不胜感激!
但是,如果工作目录是 /Users/keith/Documents/ 并且我调用我的脚本并只传递“TestFolder”,那么这个 if 语句中的测试将评估为 false,即使 TestFolder 存在于当前工作目录中。
那不正确。如果TestFolder存在于当前工作目录中,[ -d TestFolder ]则成功。所以这里没有问题。
顺便说一句,如果您想规范化文件路径并且您有 Gnu coreutils(如果您有 Linux 系统,您可能会这样做),那么您可以使用:
readlink -f "$path"
Run Code Online (Sandbox Code Playgroud)
或者
readlink -e "$path"
Run Code Online (Sandbox Code Playgroud)
不同之处在于-f即使路径中的最后一个组件不存在也会成功(因此如果路径是要创建的文件的合理名称,-e它将成功),而只有在路径解析为现有文件时才会成功或目录。有关man readlink更多详细信息,请参阅。