前言
我们日常的操作都是需要执行指令的,有的操作需要多次执行一条或多条相关的命令,那么我们就可以通过一个或多个循环来执行命令。
一、使用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五个数字
[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
[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
,之前的循环奇数和定义为
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://blog.csdn.net/weixin_71429790/article/details/126133635
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.7code.cn/show_35454.html
如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱:suwngjj01@126.com进行投诉反馈,一经查实,立即删除!