shell统计循环次数的方法和求和代码说明

本文介绍了在Linux Shell中使用expr、let及$进行循环计数的方法,展示了如何在for循环中统计满足条件的次数。此外,还探讨了Python与Shell在执行此类任务时的差异,为初学者提供了实用的Shell编程技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

说明

前提,我今天在linux上尝试用for循环统计出满足条件的循环次数,但是我发现shell不能像其他语言一样 可以用 +1 ,这可难哉了,网上搜索了很多关于统计shell循环次数的方法,竟然搜不到! 完全搜不到!!!!
所以我就自行研究了一个方法,利用 expr的方法来计数,虽然,不标准,但起码能实现!! shell是个简单的开发语言,我觉得能实现就好!
如果要严谨,提供一个思路,可以自行研究一下:可以封装个函数来做统计的累加器!

shell统计循环次数的方法

方法1(expr)

expr,这个命令是系统自带用来计算的命令

[root@ccx ~]# cat num1.sh
#!/bin/bash
# 存储 i > 5 的计数
num1=0 
# 存储 i <= 5 的计数 
num2=0  

for ((i=1; i<10; i++)); do
    if [ $i -gt 5 ]; then
        num1=`expr $num1 + 1`
    else
        num2=`expr $num2 + 1`
    fi
done

echo "大于5的数量: $num1"
echo "小于等于5的数量: $num2"
[root@ccx ~]# 
[root@ccx ~]# sh num1.sh
大于5的数量: 4
小于等于5的数量: 5
[root@ccx ~]# 

方法2(let)

  • let实际上和expr都是bash中用于计算的工具!!
  • declare或typeset内建命令(它们是完全相同的)可以用来限定变量的属性.
    • 这是在某些编程语言中使用的定义类型不严格的方式。命令declare是bash版本2之后才有的。
    • declare不加也不会错,只是这用这个说明一下有这个东西!!!!

[root@ccx ~]# cat num2.sh
#!/bin/bash
# 存储 i > 5 的计数
declare num1=0 
# 存储 i <= 5 的计数 
num2=0  

for ((i=1; i<10; i++)); do
    if [ $i -gt 5 ]; then
        #num1=`let $num1 + 1`
        let num1=$num1+1
    else
        #num2=`let $num2 + 1`
        let num2=$num2+1
    fi
done

echo "大于5的数量: $num1"
echo "小于等于5的数量: $num2"
[root@ccx ~]#
[root@ccx ~]# sh num2.sh
大于5的数量: 4
小于等于5的数量: 5
[root@ccx ~]# 

方法3(())

在 Bash 脚本中,((...)) 是一种算术扩展语法,用于执行数学运算

[root@ccx ~]# cat num3.sh
#!/bin/bash
# 存储 i > 5 的计数
num1=0 
# 存储 i <= 5 的计数 
num2=0  

for ((i=1; i<10; i++)); do
    if [ $i -gt 5 ]; then
        num1=$(($num1 + 1))
    else
        num2=$(($num2 + 1))
    fi
done

echo "大于5的数量: $num1"
echo "小于等于5的数量: $num2"
[root@ccx ~]# 
[root@ccx ~]# sh num3.sh
大于5的数量: 4
小于等于5的数量: 5
[root@ccx ~]# 

python和shell对比

另外附一张图,python和shell执行该结果的代码区别:
在这里插入图片描述

求和

whiell循环

[root@ccx ~]# cat num4.sh 
#!/bin/bash
i=0
sum=0
while [ $i -lt $1 ] ;do
        i=$(($i+1))
        sum=$(($sum+$i))
done
echo '总数相加是: '$sum
echo '循环次数是:'$i
[root@ccx ~]# sh num4.sh 5
总数相加是: 15
循环次数是:5
[root@ccx ~]#
  • 需要注意,i=$(($i+1))放再sum=$(($sum+$i))的上面下和下面是有区别的
  • 放上面
    • 自增先执行,导致每次累加的是 自增后的值(1,2,3,4,5)。
    • 循环次数由初始值 i=0 和条件 i < 5 共同决定,共执行 5 次,最终sum=15。
  • 放下面
    • 累加先执行,导致每次累加的是 自增前的值(0,1,2,3,4)。
    • 虽然循环执行了 5 次,但 初始值 i=0 被累加进去,导致最终 sum=10(而不是 15)

for循环

[root@ccx ~]# cat num6.sh 
#!/bin/bash
sum=0
count=0

for ((i=1; i<=$1; i++)); do
    ((sum += i))
    ((count++))
done

echo "总数相加是: $sum"
echo "独立计数循环次数是: $count" 
echo "自带计算循环次数是: $i" 
[root@ccx ~]# 
[root@ccx ~]# sh num6.sh 5
总数相加是: 15
独立计数循环次数是: 5
自带计算循环次数是: 6
[root@ccx ~]# 
  • 如上,其实我们不使用独立的计数参数,使用循环本身计算器也有输出,虽然i条件是<=5(1,2,3,4,5),下面输出也确实按这个来输出,但是for循环中内置计算器每次迭代后i自增 1,所以为5后虽然输出结束了,但for循环最终也会+1,最终为6,为6的时候判断不满足才结束这个for循环,所以我们输出i的时候就是6,次数循环就不满足我们实际条件了,懂我意思了把? 所以要用内置的计算参数显示正确的循环次数的话,需要-1才行。
  • 但一般不这么做,我们直接用独立的计数器变量来统计循环次数就行了,因为用内置循环变量在-1,基础不扎实的,可能就忘了这个原理,导致误解,所以直接用独立的计数器变量更省事。
  • 好了这就是关于统计和求和的使用及注意事项了,自己下去做下测试,我说的如果有理解不了的,用sh -x参数看下输出过程,彻底把我说的这些内容高清楚,拜拜。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

҉人间无事人

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值