You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Bash脚本循环中IF语句THEN分支异常重复触发问题求助

Bash脚本循环中IF语句THEN分支异常重复触发问题求助

嘿,我一眼就揪出问题根源啦!你在if条件里用的>符号,在Bash的[ ]测试语法里不是数值比较运算符,而是输出重定向符号!这就是为什么then分支每次循环都会被触发的核心原因。

问题拆解

你写的条件:

if [ $highestEntry > $highscore ]

在Bash里会被解析成:执行测试命令[ $highestEntry,然后把这个命令的输出重定向到一个名为$highscore的文件里。只要重定向操作成功(默认情况都会成功),整个if条件的退出码就是0(也就是“真”),所以每次循环都会走进then分支,完全和两个数值的大小无关!

你甚至能在脚本运行后的目录里找到一个名为0的空文件——这就是重定向操作偷偷创建的。

正确解决方法

Bash里做数值比较有两种常用的正确写法:

  1. 在[ ]里用-gt(greater than,即“大于”)运算符:
if [ $highestEntry -gt $highscore ]
  1. 使用更直观的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 10:00:30