如何在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 ...
原代码核心问题:
- 首行表头被循环读取,导致第一次累加时
$Town是字符串"Town",与整数变量拼接后产生异常值 - 尝试的部分累加语法存在错误,比如
$((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
相关产品推荐
相关产品推荐

