使用Bash/Shell脚本查询汽车最早型号时如何解决grep匹配错误问题
车型最早生产年份查询脚本匹配问题修复方案
问题根因
- 原代码
grep "^$car"仅做行首前缀匹配,未限定匹配到字段边界,会命中所有名称以$car开头的相似车型,导致匹配结果超出预期 - 原代码存在变量名冲突:随机抽取的车型存储在
$car变量中,后续读取用户输入的年份时直接覆盖了该变量,会导致后续匹配逻辑完全失效
修复方案
方案1:修改grep匹配规则(简单快速)
因为CSV字段分隔符为;,第一字段结束后会紧跟分号,在匹配字符串尾部补充分号即可限定匹配完整第一字段:
# 尾部加;限定匹配到第一字段结束,-F参数指定按固定字符串匹配,避免车型名称中的特殊字符被识别为正则 car1=`grep -F "$car;" cars | sort -n -t';' -k8 | cut -d';' -f8 | head -1`
方案2:使用awk按字段匹配(更稳妥,无特殊字符兼容问题)
直接通过awk匹配第一字段完全等于目标车型,不受名称中特殊字符影响:
# -F指定分隔符为;,-v传入目标车型变量,直接匹配第一字段完全相等的记录 car1=`awk -F';' -v target="$car" '$1 == target' cars | sort -n -t';' -k8 | cut -d';' -f8 | head -1`
额外修正:解决变量名冲突
将用户输入的年份存储到独立变量,避免覆盖车型名称变量:
# 随机抽取查询车型 car=`head -1 cars1` echo "When was the first model of the car $car made?" # 用户输入的年份存入独立变量user_answer,不覆盖car变量 read user_answer # 后续判断逻辑对应修改变量名 if [ "$user_answer" -eq "$car1" ] ; then echo "Congratulations! Your answer is correct!" else echo "If you go through the CSV file you'll see that in this case the correct answer is $car1" fi
完整修复后的参考代码
tail +3 cars.csv > cars shuf cars | cut -d';' -f1 > cars1 # 随机抽取查询车型 car=`head -1 cars1` echo "When was the first model of the car $car made?" read user_answer # 精确匹配车型后取最早生产年份 car1=`awk -F';' -v target="$car" '$1 == target' cars | sort -n -t';' -k8 | cut -d';' -f8 | head -1` if [ "$user_answer" -eq "$car1" ] ; then echo "Congratulations! Your answer is correct!" else echo "If you go through the CSV file you'll see that in this case the correct answer is $car1" fi rm cars 2> /dev/null rm cars1 2> /dev/null
内容的提问来源于stack exchange,提问作者Ruth Mary Thannikuzhuppil
相关产品推荐
相关产品推荐

