我的文件检查脚本有什么问题?

我的文件检查脚本有什么问题?

我不明白为什么在找不到文件或目录时我的脚本的最后一部分不显示任何内容。

echo -n "Please enter a filename or directory: "
read filename
if [ -z "$filename" ]; then
  echo "You did not enter anything!"
  exit 1
fi
if [ -e "$filename" ]; then
  if [ -f "$filename" ]; then
    echo "You entered a file."
  elif [ -d "$filename" ]; then
    echo "You entered a directory."
  else
    echo "You did not enter a valid file or directory."
  fi
fi
exit

我不知道我的代码有什么问题。如果输入无效或不存在的文件或目录,则不会显示回显。

答案1

我重新格式化了您的脚本以缩进if语句。这样做可以更清楚地表明您的最后一个echo仅在-f为真且-d为假时才会发生。如果用户输入不存在的文件或目录,则会-f失败。

考虑对上一节的修改:

if [ -e "$filename" ]; then
  if [ -f "$filename" ]; then
    echo "You entered a file."
  elif [ -d "$filename" ]; then
    echo "You entered a directory."
  fi
else
  echo "You did not enter a valid file or directory."
fi

第一个语句的真实部分if较早结束(由else);那么不存在的文件/目录就有一段代码要执行。

答案2

还有许多其他类型的文件不会导致此代码中的任何输出。其中包括符号链接、命名管道、套接字以及块和字符特殊文件。值得注意的是,/dev/tty/dev/stdin/dev/stdout/dev/stderr都失败了,未被代码检测到。

您可以修改逻辑来解决这个问题,但是,这种结构(case 语句样式结构)更易于阅读并且不易出错:

if [ ! -e "$filename" ]; then
    echo "$filename does not exist"
    exit 1
elif [ -f "$filename" ]; then
    echo "You entered a file."
elif [ -d "$filename" ]; then
    echo "You entered a directory."
else 
    echo "$filename is not a regular file or directory."
    exit 2
fi

相关内容