linux系列(十):shell循环结构、for、while

5.4 循环结构之for

  • for结构
for 变量 in 范围/数组;do
    statement;
done;
  • for写法
# for练习
# 获取1到10的和:写法1
sumn=0;
for n in 1 2 3 4 5 6 7 8 9 10;do
    sumn=$((sumn+n));
done;
echo "获取1到10的和1="$sumn;

# 获取1到10的和:写法2
sumn=0;
for n in {1..10};do
    sumn=$((sumn+n));
done;
echo "获取1到10的和2="$sumn;

# 获取1到10的和:写法3
sumn=0;
for ((n=1;n<=10;n++));do
    sumn=$((sumn+n));
done;
echo "获取1到10的和3="$sumn;

# 获取1到10的和:写法4
sumn=0;
for n in $(seq 10);do      #i in $(seq n)等价于((i=1;i<=n;i++))
    sumn=$((sumn+n));
done;
echo "获取1到10的和4="$sumn;
#seq 两个参数
sumn=0;
for n in $(seq 1 10);do    #i in $(seq n m)等价于((i=n;i<=m;i++))
    sumn=$((sumn+n));
done;
echo "获取1到10的和4="$sumn;
#seq 三个参数
sumn=0;
for n in $(seq 1 1 10);do    #i in $(seq n k m)等价于((i=n;i<=m;i+=k))
    sumn=$((sumn+n));
done;
echo "获取1到10的和4="$sumn;
  • 99乘法表
#99乘法表
echo "99乘法表1";
for ((i=1;i<=9;i++));do
    for ((j=1;j<=i;j++)); do
	    printf $i"*"$j"="$((i*j))"  ";
		if [ $((i*j)) -lt 10 ];then
		     printf " ";
		fi;
	done;
	echo "";
done;
#99乘法表
echo "99乘法表2";
for ((i=1;i<=9;i++));do
    for ((j=9;j>=1;j--)); do
	    if [ $j -le $i ];then
		     printf $i"*"$j"="$((i*j))"  ";
			 if [ $((i*j)) -lt 10 ];then
				 printf " ";
			 fi;
		else
		     printf "        ";
		fi;
	done;
	echo "";
done;
  • 获取1到100内质数的和
echo "求1到100内质数的和》》》》1";
sumn=0;
for ((n=1;n<=100;n++));do
   #判断当前n是不是质数
   b=1;#定义变量作为标签
   #定义一个变量让其从2跑到n-1 循环判断是否出尽
   for ((m=2;m<n;m++)) do
       if [ $((n%m)) -eq 0 ];then
	        b=$((b+1));
			break;
	   fi;
   done;
   if [ $b -eq 1  -a $n -ne 1 ];then
       echo $n"是质数!";
	   sumn=$((sumn+n));
   fi;
done;
echo "求1到100内质数的和1="$sumn;

echo "求1到100内质数的和》》》》2";
sumn=0;
for ((n=1;n<=100;n++));do
   #判断当前n是不是质数
   #定义一个变量让其从2跑到n-1 循环判断是否出尽
   for ((m=2;m<n;m++)) do
       if [ $((n%m)) -eq 0 ];then
			break;
	   fi;
   done;
   if [ $m -eq $n ];then
       echo $n"是质数!";
	   sumn=$((sumn+n));
   fi;
done;
echo "求1到100内质数的和2="$sumn;
echo "------------for练习1:99乘法表---------------";
for  ((i=1;i<=9;i++));do
      for  ((j=1;j<=i;j++));do
           printf $i"*"$j"="$((i*j))"  ";
		   if [ $((i*j)) -lt 10 ];then
		        printf " ";
		   fi;
      done;
	  echo "";
done;
echo "------------for练习2:99乘法表---------------";
for  ((i=1;i<=9;i++));do
      for  ((j=1;j<=9;j++));do
           
		   if test $i -le $j ; then
		        printf $i"*"$j"="$((i*j))"  ";
				if [ $((i*j)) -lt 10 ];then
		              printf " ";
		        fi;
		   else
		        printf "        "; 
		   fi;
      done;
	  echo "";
done;

echo "------------for练习3 判断一个数是不是质数------------------------------";
#read -p "请输入一个数字:" n;
for ((n=1;n<=100;n++)); do
    # 判断当前n是不是质数
	k=1;
	for  ((m=2;m<n;m++));do
		if test $(( n % m )) -eq 0 ;then
			  k=$[k+1];
			  break;
		fi;
	done;
	if [ $k -eq 1 -a $n -gt 1 ]; then
	   echo $n"是质数!";
	#else
	   # echo $n"不是质数!";
	fi;
done;

echo "------------for练习3 判断一个数是不是质数------------------------------";
#read -p "请输入一个数字:" n;
for ((n=1;n<=100;n++)); do
    # 判断当前n是不是质数
	k=1;
	for  ((m=2;m<n;m++));do
		if test $(( n % m )) -eq 0 ;then
			  k=$[k+1];
			  break;
		fi;
	done;
	if [ $k -eq 1 -a $n -gt 1 ]; then
	   echo '$n是质数!';# ""中的$会被解析 ''中的$不会被解析
	   echo "$n是质数!";
	#else
	   # echo $n"不是质数!";
	fi;
done;

5.5 循环结构之while

  • while格式
while 判断语句; do
    statement;
done;
  • 求质数
# 使用while获取1到100内位数上含有1的所有质数的平均值
sumn=0;geShu=0;
n=1;
while [ $n -le 100 ]; do
    #判断是否含有1
	n1=$((n%10));
	n2=$((n/10%10));
	n3=$((n/100));
	if [ $n1 -eq 1 -o $n2 -eq 1 -o $n3 -eq 1 ];then
	     #判断当前n是不是质数
         m=2;
         while [ $m -lt $n ];do
              if [ $((n%m)) -eq 0 ];then
			       break;
			  fi;
			  m=$((m+1));
      	 done;	
         if [ $m -eq $n ]; then
                sumn=$((sumn+n));
				geShu=$((geShu+1));
				echo $n"是满足条件的数字!";
         fi; 		 
	fi;
	n=$((n+1));
done;
echo "1到100内位数上含有1的所有质数的平均值="$((sumn/geShu));
echo $sumn":"$geShu"1到100内位数上含有1的所有质数的平均值="$(echo "scale=2;"$sumn"/"$geShu|bc);
echo $sumn":"$geShu"1到100内位数上含有1的所有质数的平均值="$(echo "scale=2;$sumn/$geShu"|bc);

n=1;
echo $n"---";  #获取变量的值$n在字符串中也可以解析
echo "---$n---";
  • 密码输入
# 输入三位数密码 只有5此机会:如果不是123 密码错误
ciShu=0;
m=0;
while [ $ciShu -lt 5 ];do
    ciShu=$((ciShu+1));
    read -p "请输入一个三位数:" n;
	if test $n -eq 123;then
	    m=$((m+1));
	    break;
    fi;
done;
if [ $m -eq 1 ];then
    echo "经过$ciShu后得到正确密码!";
else
     echo "输入次数5次了还没有正确!!";
fi;
  • 获取完数
echo "------------while练习 获取1到10000内所有的完数:因子之和等于此数:6 ------------------------------";
n=1;
while test $n -lt 1000 ; do
    # 判断当前n是不是完数
	sumn=0;
	#让变量m从1跑到n-1
	m=1;
	while test $m -lt $n;do
	     #判断当前m是不是n的因子
		 if [ $((n % m)) -eq 0 ];then
		     sumn=$((sumn+m));
		 fi;
		 # 迭代语句
		 m=$[m+1];
	done;
	#m跑完 通过sumn是不是等于n来判断n是不是完数
    if [ $n -eq $sumn ];then
		 echo "$n是完数!"
	fi;
	# 迭代语句
	n=$((n+1));
done;

在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值