shell之forwhileuntil循环双重循环

Posted 阳光小王子

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell之forwhileuntil循环双重循环相关的知识,希望对你有一定的参考价值。

shell编程循环语句

  • 读取不同的变量值,用来逐个执行同一组命令
格式:
for 变量名 in  聚会列表
 do
   命令序列
 done
  • for执行命令图
    在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

  • 求1-100的整数和
/1-100整数和:

[root@localhost ~]# sum=0
[root@localhost ~]# for i in $(seq 1 100)
> do
> sum=$[$sum + $i]
> done
[root@localhost ~]# echo $sum
5050

for语句应用示例

  • 批量添加用户
  • 用户名存放在users.txt文件中,每行一个,初始密码设置为123456,验证脚本
创建一个users文本文件
vim users.txt
新那一个shell脚本文件
vim demo1.sh
#!/bin/bash
user=$(cat ~/users.txt)    /将users.txt文件内容赋值给user变量
for i in $user
 do
   useradd $i
   echo 12345 | passwd --stdin &> /dev/null
   /一个一个设置密码,并将提示信息吸入黑洞
 done
-----------------------------------------------------------
验证脚本
cat /etc/passwd  
cat /etc/shadow
  • 根据IP地址查看主机状态
#!/bin/bash

ip=$(cat ~/ping.txt)

for a in $ip

   do
      ping -c 3 -i 0.5  -W 2 $a &> /dev/null

       if [ $? -eq 0 ]; then    //格式一定要注意留空格

           echo "主机在线:"

         else

           echo "主机不在线:" 

       fi

   done

while语句结构

while语句结构

while 条件测试操作
 do
   命令序列
 done
  • 根据特定条件反复执行一个命令序列,直到不满足条件为止
  • 编写时可能会出现死循环,要避免这种情况发生
  • true(真)和false(假)为特殊条件测试操作,也可以在if语句的条件测试中使用
  • true作为条件时,表示条件永远成立,无限执行,也就是死循环,需要强制终止
  • false作为条件时,表示条件不成立,不执行命令序列

while小实验

  • 批量添加用户; 用户名称以stu开头,按数字顺序进行编号
vim demo2.sh
#!/bin/bash
a=1
while [ $a -le 10 ]
do
  useradd  stu$a
  echo 123456 | passwd --stdin stu$a
  let a++
done
  • 猜商品价格
  • 通过变量RANDOM获得随机数
  • 提示用户猜测并记录次数,猜中后退出循环
#!/bin/bash

jg=$[ $RANDOM % 1000 ]

a=1
zcs=0
while [ $a -lt 2 ]
  do
   read -p "请输入商品价格:" p
   if [ $p -eq $jg ]; then
      echo "恭喜你猜对了!"
      let zcs++
      let a++
   elif [ $p -gt $jg ]; then
      echo "你猜高了,请重新输入:"
      let num++
    elif [ $p -lt $jg ];then
      echo "你猜小了,请重新输入:"
      let num++
    fi
   done
 echo "你总共猜了$num 次"

until语句

与while相反,重复测试某个条件,只要条件不成立则反复执行
在这里插入图片描述

  • 格式
until条件测试操作               while  未超过10
do                             do
  命令序列                        数字依次递增
done                           done
  • 使用until计算1-50的和
#!/bin/bash
a=1
sum=0
until [ $a -gt 50  ]
do
  sum=$[$sum+$a]
  let a++
done
  echo "1-50的和为:$sum"

双重循环

双重循环-for循环

  • 外循环一次,内循环全部执行一遍
vim dmo1.sh
#!/bin/bash

for ((a=1;a<=5;a++))
do
  echo "外层循环:$a "
  for ((b=1;b<=6;b++))
  do
    echo -e "\\t 内层循环:$b "  
  done
done
-----------------------------------------------
bash dmo1.sh
外层循环:1 
	 内层循环:1 
	 内层循环:2 
	 内层循环:3 
	 内层循环:4 
	 内层循环:5 
	 内层循环:6 
......
外层循环:5
.
.

  • break 退出当前循环
  • break 2 退出2重循环
#!/bin/bash

for ((a=1;a<=5;a++))
do
  echo "外层循环:$a "
  for ((b=1;b<=5;b++))
  do
    if [ $b -eq 5 ]; then
      break 2
    fi
    echo -e "\\t 内层循环:$b "
  done
done
-------------------------------------
运行结果:
外层循环:1 
	 内层循环:1 
	 内层循环:2 
	 内层循环:3 
	 内层循环:4 

  • continue,当条件成立时,终止当前执行的命令,继续执行后面的命令
#!/bin/bash

for ((a=1;a<=5;a++))
do
  echo "外层循环:$a "
  for ((b=1;b<=5;b++))
  do
    if [ $b -eq 3 ]; then
      continue
    fi
    echo -e "\\t 内层循环:$b "
  done
done
-------------------------------
运行结果:外循环1-5
     内循环跳过3
     
	 内层循环:5 
外层循环:5 
	 内层循环:1 
	 内层循环:2 
	 内层循环:4 
	 内层循环:5 

  • exit:表示异常退出 ,退出脚本
  • exit 1/2:表示异常退出,并且返回参数值
  • 用户输入密码,脚本判断密码是否正确,输入正确提示正确信息,连续输错3次则报警
vim dmo2.sh

#!/bin/bash
mm=123456
for i in {1..3}
do
  read -p "请输入密码:" psswd
  if [ $psswd == $mm ]; then
    echo "密码输入正确!"
    exit
  fi
done
echo "警告!你已经输入过多!"
--------------------------------------
运行结果:
[root@localhost ~]# bash dmo2.sh 
请输入密码:4
请输入密码:5
请输入密码:6
警告!你已经输入过多!
[root@localhost ~]# bash dmo2.sh 
请输入密码:123456
密码输入正确!

IFS

默认包含 空格,制表符,换行符
查看命令:set | grep IFS
IFS=$' \\t\\n'

在这里插入图片描述

#!/bin/bash

lsbl=$IFS                 /设置临时变量
IFS=$IFS:                 /以:作为分割符
for a in $( echo $PATH)
do
  echo "$a"
done

IFS=$lsbl          /程序执行完再使临时变量赋值给IFS,使参数值不会被改变
-----------------------------------------------------------------
查看环境变量:
echo $PATH
/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
运行结果:
[root@localhost ~]# bash dmo4.sh
/usr/local/sbin
/usr/local/bin
/usr/sbin
/usr/bin
/root/bin

在这里插入图片描述

从文件定向导入

#!/bin/bash
while read line   /line 为变量
do
    echo $line
done <name.txt

使用双重for循环实现九九乘法表

#!/bin/bash
a=1
b=1

for((a=1;a<=9;a++))
do
  for((b=1;b<=a;b++))
  do
     sum=$[$a * $b]
     echo -ne "$a*$b=$sum\\t"
  done
     echo " "                 /输出空格换行
done
----------------------------------------------
运行结果:
[root@localhost ~]# bash dmo5.sh 
1*1=1	 
2*1=2	2*2=4	 
3*1=3	3*2=6	3*3=9	 
4*1=4	4*2=8	4*3=12	4*4=16	 
5*1=5	5*2=10	5*3=15	5*4=20	5*5=25	 
6*1=6	6*2=12	6*3=18	6*4=24	6*5=30	6*6=36	 
7*1=7	7*2=14	7*3=21	7*4=28	7*5=35	7*6=42	7*7=49	 
8*1=8	8*2=16	8*3=24	8*4=32	8*5=40	8*6=48	8*7=56	8*8=64	 
9*1=9	9*2=18	9*3=27	9*4=36	9*5=45	9*6=54	9*7=63	9*8=72	9*9=81	

以上是关于shell之forwhileuntil循环双重循环的主要内容,如果未能解决你的问题,请参考以下文章

shell之forwhileuntil循环

shell脚本——编程之循环语句(forwhileuntil)

Shell脚本之循环语句(forwhileuntil)

shell循环:forwhileuntil——详解

Shell脚本--循环(forwhileuntil)

shell编程—循环语句forwhileuntil