协慌网

登录 贡献 社区

检查 shell 脚本中是否存在目录

在 shell 脚本中,可以使用什么命令来检查目录是否存在?

答案

要检查 shell 脚本中是否存在目录,可以使用以下命令:

if [ -d "$DIRECTORY" ]; then
  # Control will enter here if $DIRECTORY exists.
fi

或者检查目录是否不存在:

if [ ! -d "$DIRECTORY" ]; then
  # Control will enter here if $DIRECTORY doesn't 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 解释。

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

请记住,在 bash 脚本中引用变量时,始终将变量用双引号括起来。这些天孩子们长大了,他们的目录名称中可以有空格和许多其他有趣的字符。 (太空!回到我的日子,我们没有任何奇特的空间!;))

有一天,其中一个孩子会将$DIRECTORY设置为"My M0viez"来运行你的脚本,你的脚本会爆炸。你不希望这样。所以使用它。

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

注意-d测试可以产生一些令人惊讶的结果:

$ ln -s tmp/ t
$ if [ -d t ]; then rmdir t; fi
rmdir: directory "t": Path component not a directory

文件在:“什么时候目录不是目录?” 答案是:“当它是目录的符号链接时。” 一个稍微更全面的测试:

if [ -d t ]; then 
   if [ -L t ]; then 
      rm t
   else 
      rmdir t
   fi
fi

您可以在 Bash 手册中找到有关Bash 条件表达式[ builtin 命令以及[[ compound command] 的更多信息)。

要检查 shell 脚本中是否存在目录,可以使用以下命令:

if [ -d "$DIRECTORY" ]; then
  # Control will enter here if $DIRECTORY exists.
fi

或者检查目录是否不存在:

if [ ! -d "$DIRECTORY" ]; then
  # Control will enter here if $DIRECTORY doesn't 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 解释。

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

请记住,在 bash 脚本中引用变量时,始终将变量用双引号括起来。这些天孩子们长大了,他们的目录名称中可以有空格和许多其他有趣的字符。 (太空!回到我的日子,我们没有任何奇特的空间!;))

有一天,其中一个孩子会将$DIRECTORY设置为"My M0viez"来运行你的脚本,你的脚本会爆炸。你不希望这样。所以使用它。

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

注意-d测试可以产生一些令人惊讶的结果:

$ ln -s tmp/ t
$ if [ -d t ]; then rmdir t; fi
rmdir: directory "t": Path component not a directory

文件在:“什么时候目录不是目录?” 答案是:“当它是目录的符号链接时。” 一个稍微更全面的测试:

if [ -d t ]; then 
   if [ -L t ]; then 
      rm t
   else 
      rmdir t
   fi
fi

您可以在 Bash 手册中找到有关Bash 条件表达式[ builtin 命令以及[[ compound command] 的更多信息)。