shell之循环语句

导读:本篇文章讲解 shell之循环语句,希望对大家有帮助,欢迎收藏,转发!站点地址:www.bmabk.com


前言

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

一、使用for循环语句

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

1.for语句的结构

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

for循环语句的语法结构

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

2.for语句的执行流程

首先将列表中的第一个值赋给变量,执行do…done循环体中的命令序列
然后将列表中的第二个值赋给变量,并执行循环体中的命令序列…直到列表中的所有取值用完,最后跳至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 &> /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 &> /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退出本次循环,继续下面的

continue、break与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 &> /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] &> /dev/null
;;
2)
echo "购买鞋子成功"
expr $[sum+=200] &> /dev/null
;;
3)
echo "购买手套成功"
expr $[sum+=50] &> /dev/null
;;
*)
echo "购买裤子成功"
expr $[sum+=150] &> /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://www.bmabk.com/index.php/post/76555.html

(0)
小半的头像小半

相关推荐

极客之音——专业性很强的中文编程技术网站,欢迎收藏到浏览器,订阅我们!