编写简单Bash比对数值脚本:筛选前向距离小于指定参数的时间记录
问题排查与修复方案
核心错误原因
- 参数校验逻辑缺失退出语句:参数错误打印提示后没有执行
exit 1,会继续执行后续逻辑,此时$1为空,数值比较时表达式不完整,直接触发"whole expression required"报错。 fdistance赋值逻辑完全错误:fdistance=$(cut -d, -f 4)没有给cut命令输入当前行内容,cut会持续等待标准输入,同时你直接将数组变量fdistance覆盖为字符串,没有按索引$i给数组赋值,后续$fdistance[$i]实际取到的是字符串拼接结果,根本不是你要的前向距离数值。- 变量输出语法错误:
$year[$i]这种写法不会读取索引为i的year值,只会输出year的字符串值后拼接[i]文本,完全不符合需求。 - 固定偏移截取字段鲁棒性极差:通过硬编码偏移量截取日期、时间字段,只要某行的字段长度稍有偏差就会全部取错值,远不如直接按逗号分隔符拆分字段可靠。
修复后的完整脚本
#!/bin/bash # 参数校验 if [ $# -ne 1 ] then echo "wrong number of parameters" exit 1 fi input='auto.txt' # 直接按逗号分隔读取每行的5个字段 while IFS=, read -r date time speed fdistance bdistance do # 数值比较:前向距离小于入参则输出日期和时间 if [ "$fdistance" -lt "$1" ] then echo "$date $time" fi done < "$input"
修复说明
- 新增
exit 1在参数校验失败后直接终止脚本,避免空$1引发的数值比较错误。 - 调整
read逻辑,直接通过IFS=,按逗号拆分每行的5个字段,不需要手动做字符串截取,逻辑更简洁不易出错。 - 直接用读取到的
fdistance字段做数值比较,不需要额外定义数组存储所有行的前向距离,资源开销更低。 - 直接输出读取到的原生日期、时间字段,输出格式和原文件格式完全一致,没有语法错误。
内容的提问来源于stack exchange,提问作者Aaaa123
相关产品推荐
相关产品推荐

