关于编写检查当前目录指定文件是否存在的Bash脚本的技术问询
关于文件存在检查脚本的问题分析与改进方案
这个实现逻辑其实存在不少潜在问题,咱们一步步拆解来看:
现有脚本的核心问题
- 依赖本地化错误信息,兼容性差:你硬编码的
failure字符串是find命令的英文错误提示,但如果系统语言切换为中文、西班牙语等其他语言,find的错误输出会变成对应语言的文本,此时你的字符串比较完全失效,脚本会直接误判文件存在。 - find的匹配逻辑不符合需求:你的目标是检查当前目录下的文件是否存在,但
find $1默认会遍历整个目录树——如果子目录里有同名文件,find会返回该子目录下的文件路径,导致脚本错误地认为当前目录的文件存在;如果传入的参数是通配符(比如*.sh),find会返回所有匹配的文件,同样会触发误判。 - 未处理参数缺失的边界情况:如果用户运行脚本时忘记传入文件名参数,
find $1就等价于find .,会输出当前目录下的所有文件和目录,此时肯定不等于你定义的错误字符串,脚本会错误输出“file exists”。 - 效率冗余:调用
find这个外部命令来做简单的文件存在检查完全没必要,bash本身就有内置的文件测试运算符,性能更好,逻辑也更可靠。
更合理的改进方案
其实bash内置了专门的文件测试工具,针对不同需求可以选择不同的运算符:
方案1:检查普通文件(非目录、链接等)是否存在
#!/bin/bash # 先处理参数缺失的情况 if [ $# -eq 0 ]; then echo "请传入要检查的文件名" exit 1 fi # 使用内置的-f运算符检查普通文件 if [ -f "$1" ]; then echo "file exists" else echo "file not exists" fi
方案2:检查任意类型的文件/目录/链接是否存在
如果你的需求不局限于普通文件,而是要检查任意类型的文件系统对象是否存在,可以用-e运算符:
#!/bin/bash if [ $# -eq 0 ]; then echo "请传入要检查的文件名" exit 1 fi if [ -e "$1" ]; then echo "file exists" else echo "file not exists" fi
另外要注意给变量$1加上双引号,这样可以避免文件名包含空格、特殊字符时出现解析错误。
内容的提问来源于stack exchange,提问作者Iomanip
相关产品推荐
相关产品推荐

