Bash:如何检查目录是否存在?

4

我编写了以下的if-else语句来检查directory1directory2是否存在。

if [ -d /opt/directory1 ] || [ -d /opt/directory2 ]; then
 echo "SUCCESS"
else
 echo "FAil
fi

然而,在一些服务器上,我遇到了一个错误。
[: /opt/directory1: binary operator expected

所有服务器都使用 bash


如何检查Shell版本? - meallhour
1
@rkta有一定道理。您确定所有服务器都在使用Bash(如标签中所建议)吗?也许其中一些正在运行另一个shell:tcsh,ksh,zsh... 您可以使用命令 echo $0 检查当前正在运行的shell。 - Ronan Boiteau
所有服务器都在使用 bash,我也已经检查过了。 - meallhour
(除了您代码中缺少一个双引号之外),https://shellcheck.net 实际上并没有说需要一个“-d”,但它确实指出了导致问题的正确位置。因此,在发布问题之前,请在该网站上检查您的代码。很高兴您解决了这个问题(一些服务器允许它,而一些则会抱怨,与“echo $BASH_VERSION”进行比较)。祝你好运。 - shellter
2个回答

8
使用Bash,这将为您提供所需的行为:
if [[ -d /opt/directory1 ]] || [[ -d /opt/directory2 ]] ; then
    echo "SUCCESS"
else
    echo "FAIL"
fi

请注意两个条件中-d的用法。

即使“directory”存在,我仍然得到“FAIL”作为输出。您认为这可能与目录的权限有关吗? - meallhour
1
@meallhour,目录本身的权限不重要,但您需要至少拥有其父目录和路径上每个目录的搜索(“执行”)权限。 因此,对于 [[ -d /foo/bar/baz ]],您需要访问 /foo 和 /foo/bar,但不需要访问 /foo/bar/baz。 - Gordon Davisson

3

一个简单的 Shell 脚本可以为您提供答案。

#!/bin/bash
DIR="$1"

if [ $# -ne 1 ]
then
    echo "Usage: $0 {dir-name}"
    exit 1
fi

if [ -d "$DIR" ]
then
    echo "$DIR directory  exists!"
else
    echo "$DIR directory not found!"
fi

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