前言

我们日常操作都是需要执行指令的,有的操作需要多次执行一条或多条相关命令,那么我们可以通过一个多个循环执行命令

一、使用for循环语句

格式一:for 变量 in $xx(①为变量准备赋值元素 ②决定循环次数
格式二:for ((i=0;i<=10;i++))(①定义变量起始值;②定义循环结束条件;③控制循环次数)
两种格式格式一主要为了输出元素格式二主要定义次数

1.for语句结构

使用for循环语句时,需要指定一个变量可能取值列表针对一个不同的取值重复执行相同命令序列知道变量值用完退出循环。在这里,“取值列表”为for语句的执行条件,其中包括多个属性相同对象需要预先指定

for循环语句语法结构

for 变量名 in 取值列表
do 
    命令序列
done

2.for语句的执行流程

首先将列表中第一个值赋给变量,执行dodone循环体中的命令序列
然后将列表中第二个值赋给变量,并执行循环体中的命令序列…直到列表中的所有取值用完,最后跳至done语句表示结束循环

3.for语句应用实列

打印1-5五个数

{1…5}表示范围1-5,for循环五次退出

[root@yzq for]# sh i.sh 
1
2
3
4
5
[root@yzq for]# cat i.sh 
#!/bin/bash
for i in {1..5}
 do
	echo $i
 done

打印五次hello

注意:虽然我们定义了一个变量i,但是没有使用它,它只是控制循环次数。

[root@yzq for]# sh hello.sh 
hello
hello
hello
hello
hello
[root@yzq for]# cat hello.sh 
#!/bin/bash
for i in {1..5}
 do 
	echo hello
 done

打印abcde

可以在for循环的范围使用abcde这种表达

[root@yzq for]# sh abc.sh 
a
b
c
d
e
[root@yzq for]# cat abc.sh 
#!/bin/bash
for i in a b c d e
do 
	echo $i
done

输出0-20之间偶数

{0…20…2} …2表示步长为2,每隔两个,即每次循环的数为+2:0+2,2+2…

[root@yzq for]# sh oushu.sh 
0
2
4
6
8
10
12
14
16
18
20
[root@yzq for]# cat oushu.sh 
#!/bin/bash
for i in {0..20..2}
do
	echo $i
done

技巧:花括号{}和seq在for循环的应用

for i in {1…50…2} 1-50的奇数
for i in {2…50…2} 1-50的偶数
for i in {10…1} 1-10倒序排列
for i in $(seq 10) 1-10正序排列
for i in $(seq 10 -1 1) 1-10倒叙排列(-1代表无限,上限,最大值,1表示起始)
for i in $(seq 1 2 10) 1-10的奇数,中间为步长
for i in $(seq 0 2 10) 0-10的偶数,中间为步长
{1…5}=seq 5

不带列表循环执行时由用户指定参数参数个数决定的

for 变量名
do
	command
done

hello2.0版本

[root@yzq for]# sh hello.sh 1
hello
[root@yzq for]# sh hello.sh 1 2 3
hello
hello
hello
[root@yzq for]# sh hello.sh 3
hello
[root@yzq for]# cat hello.sh 
#!/bin/bash
for i 
 do 
	echo hello
 done

[root@yzq for]# sh hello.sh 1 2 3 1 2
1
2
3
1
2
[root@yzq for]# cat hello.sh 
#!/bin/bash
for i 
 do 
	echo $i
 done

打印1-10的奇数

((i=1;i<=10;i+=2)) i起始值为1,最后一次循环的i值为小于等于10;每次循环i+2

[root@yzq for]# sh jishu.sh 
1
3
5
7
9
[root@yzq for]# 
[root@yzq for]# cat jishu.sh 
#!/bin/bash
for ((i=1;i<=10;i+=2))
do
	echo $i
done

计算1-10的奇数和

sum=0定义一个变量
((i=1;i<=10;i+=2)) 循环奇数1.3…
let sum=

i

+

i+

i+sum 这么定义每次循环的奇数为

i

,之前的循环奇数和定义

i,之前的循环奇数和定义

i,之前的循环奇数和定义sum
最后输出的$sum为 1-10的奇数和

根据IP检测主机状态

文本查看
创建一个包ip地址的文本,设为变量脚本会依次读取文本中ip地址循环
$ip脚本每个读取的ip

[root@yzq for]# sh ping.sh 
host 192.168.28.2 is up
host 192.168.28.10 is up
host 192.168.28.100 is down
host 192.168.28.222 is down
host baidu.com is up
[root@yzq for]# cat ping.sh 
#!/bin/bash
host=`cat /opt/host.txt`
for ip in $host
do
ping -c 3 -i 0.2 -W 2 $ip &amp;&gt; /dev/null
if [ $? -eq 0 ];then
   echo "host $ip is up"
else
   echo "host $ip is down"
fi
done

网段查看
可以选择某个网段查看主机状态,如想要看到输出过程,可创建一个文本而不注入黑洞文件/dev/null;而up和down状态分别注入不同文件查看

[root@yzq for]# sh ping.sh 
host 1 is down
host 2 is up
host 3 is down
host 4 is down
host 5 is down
host 6 is down
host 7 is down
host 8 is down
host 9 is down
host 10 is up
[root@yzq for]# cat ping.sh 
#!/bin/bash
#host=`cat /opt/host.txt`
for ip in `seq 10`
do
ping -c 1 -i 0.2 -W 2 192.168.28.$ip &amp;&gt; /dev/null
if [ $? -eq 0 ];then
   echo "host $ip is up"
else
   echo "host $ip is down"
fi
done

幸运会员

expr $[ RANDOM%3+1 ] 输出1-3的随机数

[root@yzq opt]# cat name.txt | grep 2 | awk -F: '{print $2}'
[root@yzq opt]# cat name.txt 
1:zhangsan
2:lisi
3:wangwu

查看name.txt文件中的第二行,并以:为分割第二个位置变量(注意使用’’是$2变量没有其他意义);以次来取出人名

[root@yzq for]# sh lucky.sh 
第1轮选中的是wangwu
第2轮选中的是lisi
第3轮选中的是lisi
第4轮选中的是lisi
第5轮选中的是lisi
第6轮选中的是zhangsan
第7轮选中的是wangwu
第8轮选中的是zhangsan
第9轮选中的是lisi
第10轮选中的是zhangsan
zhangsan:3次;lisi:5次;wangwu:2次
[root@yzq for]# cat lucky.sh 
#!/bin/bash
a=0
b=0
c=0
for ((i=1;i<=10;i++))
do
 num=$(expr $[RANDOM%3+1])
 name=$(cat /opt/name.txt | grep $num | awk -F: '{print $2}')
 case $name in
	zhangsan)
	let a++
	;;
	lisi)
	let b++
	;;
	wangwu)
	let c++
	;;
 esac
 echo "第$i轮选中的是$name"
done
  echo "zhangsan:$a次;lisi:$b次;wangwu:$c次"

数字炸弹游戏

数字炸弹游戏Ⅰ: 要求在1-100内定义个数字,与用户交互,要求,每次提醒用户,数字猜大了还是猜小了,直到猜中为止,最后统计猜的次数,最多猜20次

[root@yzq for]# sh boom.sh 输入一个(1-50)之间数字:25
你输入数字小了
请输入一个(1-50)之间数字:30
你输入数字大了
请输入一个(1-50)之间数字:27
你对了
你一共猜了3次
[root@yzq for]# cat boom.sh 
#!/bin/bash
a=$(expr $[RANDOM%50+1])
b=0
for ((i=1;i<=20;i++))
do
read -p "请输入一个(1-50)之间的数字:" num
  let b++
   if [ $num -gt $a ];then
    echo "你输入的数字大了"
     elif [ $num -lt $a ];then
       echo "你输入的数字小了"
        elif [ $num -eq $a ];then
         echo "你对了"
echo "你一共猜了$b次"
exit
   fi
done

猜对了后面使用exit或者break退出循环,不然会一直循环下去,continue退出本次循环,继续下面的

continuebreak与exit

1.continue
继续,但不会执行循环体内下面得代码,开始重新下一次循环

打印1-5得数字,3不打印
[root@yzq for]#sh daying.sh 
1
2
4
5
[root@yzq for]#cat daying.sh 
#!/bin/bash
for ((i=1;i<=5;i++))
do
 if [ $i -eq 3 ];then
  continue
  else
  echo $i
 fi
done

输出结果为1245,3不输出,因为continue跳出后面的echo语句执行下一次循环了
2.break
打断,马上停止本次循环,执行循环体外得代码

1-10得数字,7后面得都不打印
[root@yzq for]#sh break.sh 
1
2
3
4
5
6
7
[root@yzq for]#cat break.sh 
#!/bin/bash
for ((i=1;i<=10;i++))
do
 if [ $i -eq 8 ];then
  break
  else
  echo $i
 fi
done

3.exit

直接跳出程序,后面跟返回状态
[root@yzq for]#sh exit.sh 3
1
2
[root@yzq for]#echo $?
21
[root@yzq for]#cat exit.sh 
#!/bin/bash
for i in {1..5}
do
 if [ $i -eq 3 ];then
  exit 21
 else
  echo $i
 fi
done
echo hi

直接跳出程序所以不会执行echo hi,并通过echo $?返回码21查看

二、使用while循环语句

要求控制循环次数、操作对象按数字顺序编号、按特定条件执行重复操作等情况,适合while语句

1.while语句的结构

使用while循环语句时,可以根据特定的条件反复执行一个命令序列,直到该条件不再满足为止,(判断的不是表达的条件而是布尔值

while循环语句的语法结构

while 条件测试操作
do 
  命令序列
done

2.while语句的执行流程

首先判断while后的条件测试操作结果,如果条件成立,执行do…done循环体中的命令序列
返回while后再次判断条件测试结果,如果条件仍然成立,则继续执行循环体;
如此循环,直到while后的条件测试结果不再成立为止,最后跳转到done语句,表示结束循环

3.while语句应用示例

打印1-5

[root@yzq while]# sh dayin.sh 
1
2
3
4
5
[root@yzq while]# cat dayin.sh 
#!/bin/bash
i=1
while [ $i -le 5 ]
do
 echo "$i"
  let i++
done

如果不用let i++会死循环

猜数字,猜不对一直猜

[root@yzq while]# sh caishuzi.sh 输入1-30的一个数:20
你猜大了
请输入1-30的一个数:15
你猜大了
请输入1-30的一个数:10
你猜大了
请输入1-30的一个数:5
你猜大了
请输入1-30的一个数:2
你猜小了
请输入1-30的一个数:1
你猜小了
请输入1-30的一个数:4
你猜对了
[root@yzq while]# cat caishuzi.sh 
#!/bin/basjh
num=$(expr $[RANDOM%30+1])
while true
do
 read -p "请输入1-30的一个数:" shu
 if [ $shu -eq $num ];then
  echo "你猜对了"
  break
  elif [ $shu -gt $num ];then
   echo "你猜大了"
  elif [ $shu -lt $num ];then
   echo "你猜小了"
 fi
done

输出1-100之间不能被3整除的数字

[root@yzq while]# cat 33.sh 
#!/bin/bash
i=1
while [ $i -le 100 ]
do
 if [[ $i%3 -ne 0 ]];then
  echo "$i"
 fi
let i++
done

猜数字

[root@yzq while]# sh caishuzi.sh 
请输入1-30的一个数:15
你猜小了
请输入1-30的一个数:20
你猜小了
请输入1-30的一个数:23
你猜小了
请输入1-30的一个数:25
你猜小了
请输入1-30的一个数:27
你猜对了
你一共猜了5次
[root@yzq while]# cat caishuzi.sh 
#!/bin/basjh
num=$(expr $[RANDOM%30+1])
a=0
while true
do
 read -p "请输入1-30的一个数:" shu
 let a++
 if [ $shu -eq $num ];then
  echo "你猜对了"
  break
  elif [ $shu -gt $num ];then
   echo "你猜大了"
  elif [ $shu -lt $num ];then
   echo "你猜小了"
 fi
done
echo "你一共猜了$a次"

批量添加规律编号用户

[root@yzq while]# cat tianjiayonghu.sh 
#!/bin/bash
users="students"
i=1
while [ $i -le 10 ]
do
useradd ${users}$i
echo "123456" | passwd --stdin ${user}$i &amp;> /dev/null
let i++
done

商品价格(0-99)

[root@yzq while]# sh caijiage.sh 
请输入价格(0-100):50
你猜大了
请输入价格(0-100):40
你猜大了
请输入价格(0-100):30
你猜大了
请输入价格(0-100):20
你猜大了
请输入价格(0-100):10
你猜大了
请输入价格(0-100):1
你猜小了
请输入价格(0-100):5
你猜小了
请输入价格(0-100):7
你猜小了
请输入价格(0-100):8
你猜小了
请输入价格(0-100):9
猜对了
[root@yzq while]# cat caijiage.sh 
#!/bin/bash
a=$(expr $[RANDOM%100])
b=0
while true
read -p "请输入价格(0-100):" jiage
do
let b++
 if  [ $jiage -eq $a ];then
  echo "猜对了"
   exit
elif [ $jiage -gt $a ];then
  echo "你猜大了"
   else 
    echo "你猜小了"
 fi
done
       echo "你一共猜了$b次"

awk一个小用法

awk ‘///{print $4}’ 打印/目录的第四行,//表示取的关键字应该写///,但是/有其他含义。所以用转义保证输出的关键字是根/

统计消费价格

首先要求有4家店,每家店 3个商品(3个商品的价格统一为100 200 300),然后要求以交互式方式,让用户选择进入哪家店,并且选择哪个商品(用户如果进入商店假设必定至少会买一件),最后统计此次消费价格

[root@yzq sh]# sh xiaofei.sh 
进入第1家店
是否进入看看yes/no):no
进入第2家店
是否进入看看yes/no):no
进入第3家店
是否进入看看yes/no):no
进入第4家店
是否进入看看yes/no):no
今日消费0,牛蛙
[root@yzq sh]# sh xiaofei.sh 
进入第1家店
是否进入看看yes/no):yes
1.衣服100块
2.鞋子200块
3.手套50块
4.裤子150块
您需要哪件商品:1
购买衣服成功
是否继续购买(yes/no):no
进入第2家店
是否进入看看yes/no):no
进入第3家店
是否进入看看yes/no):no
进入第4家店
是否进入看看yes/no):no
今日消费100,牛蛙
[root@yzq sh]# cat xiaofei.sh 
#!/bin/bash
i=1
sum=0
while [ $i -lt 5 ]
do
 echo "进入第$i家店"
 read -p "是否进入看看(yes/no):" ask
 while [ $ask = "yes" ]
  do
echo "1.衣服100块
2.鞋子200块
3.手套50块
4.裤子150块"
 read -p "您需要哪件商品:" num
 case $num in
1)
echo "购买衣服成功"
expr $[sum+=100] &amp;> /dev/null
;;
2)
echo "购买鞋子成功"
expr $[sum+=200] &amp;> /dev/null
;;
3)
echo "购买手套成功"
expr $[sum+=50] &amp;> /dev/null
;;
*)
echo "购买裤子成功"
expr $[sum+=150] &amp;> /dev/null
;;
 esac
read -p "是否继续购买(yes/no):" ask
done
 let i++
if [ $ask = "no" ]
then
continue
fi
done
echo "今日消费$sum,牛蛙"

三角形

外循环定义行数,内循环定义输出几个*
echo -n “* ” -n不换行,如果换行的话会输出竖排的*,*后面有个空格看起来更舒服

[root@yzq sh]# sh sanjiao.sh 4
* 
* * 
* * * 
* * * * 
[root@yzq sh]# cat sanjiao.sh 
#!/bin/bash
for ((i=1;i<=$1;i++))
do
 for ((j=1;j<=$i;j++))
  do
   echo -n "* "
done
 echo
done

三角

[root@yzq sh]# sh daosanjiao.sh 4
* * * * 
* * * 
* * 
* 
[root@yzq sh]# cat daosanjiao.sh 
#!/bin/bash
for ((i=$1;i>=1;i--))
do
  for ((j=1;j<=i;j++))
  do
   echo -n "* "
done
echo
done

99乘法表

[root@yzq sh]#sh 99.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 

[root@yzq sh]#cat 99.sh 
#!/bin/bash
for ((i=1;i<=9;i++))
do
 for ((j=1;j<=i;j++))
  do
  echo -n "$i * $j = $(expr $i * $j) "
   if [ $j -eq $i ];then
    echo -e "n"
   fi
  done
done

三、使用until循环语句

until循环语句和while语句用法相反,while以true作为条件,循环体内的命令将永远执行下去,而until以false作为条件,只要条件不成立则会反复执行,循环体内的命令将永远执行下去

1.格式

until 条件测试操作
do
	命令序列
done

2.示例

计算1-50的和的写法

[root@yzq until]#sh he.sh 
1275
[root@yzq until]#cat he.sh 
#!/bin/bash
i=0
sum=0
until [ $i -eq 51 ]
 do
  let sum+=i
  let i++
 done
echo $sum

原文地址:https://blog.csdn.net/weixin_71429790/article/details/126133635

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_35454.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注