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

如何在Bash循环中用整数变量正确累加整数变量?

Bash循环中整数变量累加问题解决

问题说明

在Bash脚本的while read循环中尝试累加整数变量时,出现不符合预期的结果:totalNumberOfTowns变量中混入了表头的"Town"字符串,同时尝试的几种累加语法均报错。场景是读取包含表头的cities.txt文件,累加每行的Town和Village数值。

cities.txt结构示例:

Plate   City    Town    Village Area    Population
1   ADANA   15  508 14030   2258718
2   ADIYAMAN    9   420 7614    632459
3   AFYONKARAHİSAR  18  395 14230   736912
...

原代码核心问题:

  1. 首行表头被循环读取,导致第一次累加时$Town是字符串"Town",与整数变量拼接后产生异常值
  2. 尝试的部分累加语法存在错误,比如$((expr $totalNumberOfTowns + $Town))误用了expr与算术扩展的组合,$((totalNumberOfTowns + Town))未正确引用变量$Town

错误原因拆解

  • 表头未跳过:循环直接读取文件首行,表头字符串"Town"被赋值给变量$Town,此时执行累加操作会触发字符串拼接而非整数运算
  • 语法错误:
    • expr是独立外部命令,不需要嵌套在$((...))算术扩展中
    • 算术扩展中引用变量必须加$符号,否则会被当作字面量处理

解决方案

1. 跳过文件首行表头

有两种简单方式实现:

  • 方法一:循环前执行一次read丢弃首行
    read -r  # 读取并丢弃表头行
    while read Plate City Town Village Area Population; do
        # 循环逻辑
    done < "cities.txt"
    
  • 方法二:用tail命令跳过首行后传入循环
    tail -n +2 "cities.txt" | while read Plate City Town Village Area Population; do
        # 循环逻辑
    done
    

2. 使用正确的整数累加语法

结合已用declare -i声明整数变量的前提,以下几种写法均有效:

  • 使用let命令:
    let totalNumberOfTowns+=$Town
    let totalNumberOfVillages+=$Village
    
  • 使用Bash算术扩展$((...)):
    totalNumberOfTowns=$((totalNumberOfTowns + $Town))
    totalNumberOfVillages=$((totalNumberOfVillages + $Village))
    
  • 利用declare -i特性直接赋值(需确保变量为整数):
    totalNumberOfTowns+=$Town
    totalNumberOfVillages+=$Village
    

完整修正代码

#!/usr/bin/env bash

average=0
numberOfCities=80

declare -i totalNumberOfTowns=0 totalNumberOfVillages=0
arrayWithOut=""

# 跳过表头行
read -r

while read Plate City Town Village Area Population; do
    echo "$Plate $City $Town $Village $Area $Population"

    # 正确累加整数变量
    let totalNumberOfTowns+=$Town
    let totalNumberOfVillages+=$Village

    # 打印当前累加结果
    printf "\n当前城镇总数: %d\n" "$totalNumberOfTowns"
done < "cities.txt"

# 循环结束后打印最终统计结果
printf "\n最终统计:\n城镇总数: %d\n乡村总数: %d\n" "$totalNumberOfTowns" "$totalNumberOfVillages"

内容的提问来源于stack exchange,提问作者Mahmut Salman

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 09:21:01