Bash脚本循环中IF语句THEN分支异常重复触发问题求助
Bash脚本循环中IF语句THEN分支异常重复触发问题求助
嘿,我一眼就揪出问题根源啦!你在if条件里用的>符号,在Bash的[ ]测试语法里不是数值比较运算符,而是输出重定向符号!这就是为什么then分支每次循环都会被触发的核心原因。
问题拆解
你写的条件:
if [ $highestEntry > $highscore ]
在Bash里会被解析成:执行测试命令[ $highestEntry,然后把这个命令的输出重定向到一个名为$highscore的文件里。只要重定向操作成功(默认情况都会成功),整个if条件的退出码就是0(也就是“真”),所以每次循环都会走进then分支,完全和两个数值的大小无关!
你甚至能在脚本运行后的目录里找到一个名为0的空文件——这就是重定向操作偷偷创建的。
正确解决方法
Bash里做数值比较有两种常用的正确写法:
- 在
[ ]里用-gt(greater than,即“大于”)运算符:
if [ $highestEntry -gt $highscore ]
- 使用更直观的Bash算术扩展语法
(( )):
if (( highestEntry > highscore ))
额外的脚本优化建议
你的脚本每次循环都重复调用perl、tail、awk处理scorelist.txt,有点浪费资源。可以用awk一次性提取所有需要的信息,减少进程调用:
#!/bin/bash highscore=0 for i in {1..5} do dt=$(date '+%d/%m/%Y %H:%M:%S') # 用awk一次性提取最后一条分数和最高分数 read lastEntry highestEntry <<< $(awk '/Score: [0-9]+/ { score = $2 last = score if (score > max) max = score } END { print last, max }' scorelist.txt) echo "$dt" echo "Round: $i" echo "Your score: $lastEntry" echo "Highscore: $highscore" # 使用正确的数值比较 if (( highestEntry > highscore )) then echo "更新最高分:从 $highscore 到 $highestEntry" highscore=$highestEntry fi sleep 1 done
这样修改后,每次循环只需要调用一次awk就能拿到需要的两个值,效率更高,代码也更简洁。
效果验证
当highscore被更新到18之后,下一次循环的条件(( 18 > 18 ))会返回“假”,then分支就不会再触发了,完全符合你的预期。
备注:内容来源于stack exchange,提问作者qwerty
相关产品推荐
相关产品推荐

