说明
前提,我今天在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参数看下输出过程,彻底把我说的这些内容高清楚,拜拜。