如何在Bash shell脚本中检查目录是否存在?

41 浏览
0 Comments

如何在Bash shell脚本中检查目录是否存在?

如何在Bash shell脚本中检查目录是否存在?

admin 更改状态以发布 2023年5月22日
0
0 Comments

在Bash脚本中引用变量时,总是要用双引号将其包裹起来。

if [ -d "$DIRECTORY" ]; then
    # Will enter here if $DIRECTORY exists, even if it contains spaces
fi

现在的孩子们会在目录名中加入空格和许多其他有趣的字符。(空格!在我们那个年代,我们可没有那些花哨的空格!)有一天,其中一个孩子会用$DIRECTORY设置为"My M0viez"来运行你的脚本,然后你的脚本就会炸掉。你不想看到这种情况发生。所以要使用双引号。

0
0 Comments

要检查目录是否存在:

if [ -d "$DIRECTORY" ]; then
  echo "$DIRECTORY does exist."
fi

要检查目录是否不存在:

if [ ! -d "$DIRECTORY" ]; then
  echo "$DIRECTORY does not exist."
fi


然而,正如Jon Ericson指出的那样,如果不考虑到指向目录的符号链接,后续命令可能无法按预期工作。例如,运行以下命令:

ln -s "$ACTUAL_DIR" "$SYMLINK"
if [ -d "$SYMLINK" ]; then 
  rmdir "$SYMLINK" 
fi

会产生错误消息:

rmdir: failed to remove `symlink': Not a directory

因此,如果后续命令需要目录,则可能需要对符号链接进行不同的处理:

if [ -d "$LINK_OR_DIR" ]; then 
  if [ -L "$LINK_OR_DIR" ]; then
    # It is a symlink!
    # Symbolic link specific commands go here.
    rm "$LINK_OR_DIR"
  else
    # It's a directory!
    # Directory command goes here.
    rmdir "$LINK_OR_DIR"
  fi
fi


请特别注意用于包装变量的双引号。原因由8jean在另一个答案中解释。

如果变量包含空格或其他不寻常字符,可能会导致脚本失败。

0