编写文件类型判断Bash脚本:是否需先检查文件存在?求优化方案
问题解答
是否必须先检查文件是否存在?
不是必须,但取决于你是否需要区分「文件不存在」和「存在但既不是普通文件也不是目录」这两种场景:
- 如果不需要区分,直接用
-f/-d判断即可——不存在的文件会让这两个测试都返回假,最终走到else分支,但此时else的提示会把「不存在」和「其他特殊类型(如设备文件、套接字)」混为一谈。 - 如果需要给用户精准的提示,明确区分「不存在」和「存在但非普通文件/目录」,那先通过
-e检查存在性是必要的。
更高效的实现方式
你的现有脚本存在变量名混乱(开头用了未定义的$input_name)、中文引号导致语法错误的问题,以下是优化后的实现:
方案1:区分「不存在」和「其他类型」的版本
#!/bin/bash echo "Enter the path:" read -r input # 先校验存在性 if [ ! -e "$input" ]; then echo "Error: '$input' does not exist." exit 1 fi # 判断文件类型 if [ -f "$input" ]; then echo "'$input' is a regular file" elif [ -d "$input" ]; then echo "'$input' is a directory" else echo "'$input' is neither a regular file nor a directory" fi
方案2:用case语句简化逻辑(直接覆盖所有场景)
#!/bin/bash echo "Enter the path:" read -r input # 用stat直接获取文件类型,屏蔽不存在时的错误输出 case "$(stat -c %F "$input" 2>/dev/null)" in "regular file") echo "'$input' is a regular file" ;; "directory") echo "'$input' is a directory" ;; "") echo "Error: '$input' does not exist." exit 1 ;; *) echo "'$input' is a $(_)" ;; esac
核心优化点
- 用
read -r避免输入中的反斜杠被意外转义 - 统一使用英文双引号
""包裹变量,防止空格或特殊字符导致语法错误 - 用case语句替代多个elif,逻辑更清晰,后续扩展其他文件类型更方便
内容的提问来源于stack exchange,提问作者user88888888
相关产品推荐
相关产品推荐

