我的bash文件删除脚本存在什么问题?有没有更优的实现方案?
现有脚本的错误点
- 没有读取用户输入的逻辑:输出确认提示后没有用
read命令获取用户输入的内容,$answer变量全程为空,判断逻辑不可能正常触发 - 字符串比较语法不兼容:单中括号
[ ]中判断字符串相等应该用=,==是双中括号[[ ]]的专用语法,在POSIX兼容的sh环境下会直接报错 - 变量未包裹引号:
$answer没有加双引号,一旦用户输入的内容包含空格、特殊字符,判断逻辑会出错,执行rm时还可能误删不相关的文件 - 变量逻辑冲突:第一个提示让用户输入y/n确认,第二个提示要用户输入要删除的文件名,全程复用同一个
$answer变量,就算前面流程走通,最后删除的也是输入的y/n字符,根本不是目标文件 - 缺少错误处理:没有判断用户输入的文件是否存在,直接执行rm会抛出无意义的报错
修正后的参考实现
#!/bin/bash # 先确认操作意愿 echo -n "你确认要删除这些文件吗?[y/n]" read -r confirm if [ "$confirm" = "y" ]; then # 确认后再读取要删除的文件名 echo -n "请输入你要删除的文件路径:" read -r target_file # 先判断文件是否存在 if [ -f "$target_file" ]; then # 删之前再二次确认一次,避免误删 rm -i "$target_file" && echo "文件已删除" else echo "错误:指定的文件不存在" fi else echo "已取消操作!" fi
额外优化建议
- 如果要批量删除指定后缀的文件,不需要手动输入文件名,可以直接用通配符,比如要删除当前目录所有txt文件直接写
rm *.txt,也可以加-i参数逐个确认 - 如果要按时间、大小等规则筛选删除,可以搭配
find命令使用,比如删除7天前的log文件:find ./ -name "*.log" -mtime +7 -delete,执行前可以先把-delete换成-print先预览要删除的文件列表,避免误删
内容的提问来源于stack exchange,提问作者YetNT
相关产品推荐
相关产品推荐

