概述
循环语句之for、while语句
- 一.for循环语句
- 1.1for循环结构
- 1.2 经典for语句案例
- 1.2.1 显示打印输出1-6
- 1.2.2 调用显示i的值
- 1.2.3 输出0到20之间的偶数和奇数
- 1.2.4 `不带列表循环`执行时由`用户指定参数和参数的个数决定的`
- 1.2.5 批量创建用户,并设置密码
- 1.2.6 根据ip地址列表检查主机状态
- 1.2.7 判断密码输入是否正确!
- 1.2.8 幸运会员抽奖
- 1.3 类C风格的for循环
- 1.3.1 显示输出1-5
- 1.3.2 嵌套循环 星星的格式
- 1.3.3 9 9乘法表
- 1.3.4 随机生成密码(达到一定复杂度)
- 二.while语句
- 2.1 经典案例
- 2.1.1 打印1-5
- 2.1.2 输出1到100能被3整除的数字
- 2.2.3 开启apache服务
- 2.2.4 猜数字的案例,猜不对就一直猜,猜对了退出
- 2.2.5 猜商品价格
- 2.2.6 监控系统资源中的内存和硬盘空间
- 2.2.7 break与continue的区别
- 2.2.8 商店购物 并打折
- 三. until 循环语句结构
- 3.1 计算0-50的和?
- 福利待遇:编写脚本的思路
一.for循环语句
在实际工作中,经常会遇到某项任务需要多次执行的情况,而每次执行时仅仅是处理的对象不一样,其他命令相同。例如,根据通讯录中的姓名列表创建系统账号,根据服务器清 单检查各主机的存活状态。
当面对各种列表重复任务时,使用简单的 if 语句已经难以满足要求,而顺序编写全部代 码更是显得异常烦琐、困难重重,所以for的出现让程序变得简单明了。
1.1for循环结构
功能:读取不同的变量值,用来逐个执行同一组命令
语法结构:
(1)列表循环
(2)不带列表循环
(3)类C风格的for循环
for 变量名 in 取值列表
do
命令序列
done
1.2 经典for语句案例
1.2.1 显示打印输出1-6
for i in `seq 6` //seq 6=1、2、3、4、5、6序列
do
echo $i
done
或
1.2.2 调用显示i的值
for i in a b c //这里调用到i变量了,所以就正常显示i的值(abc)
do
echo $i
done
1.2.3 输出0到20之间的偶数和奇数
花括号{}和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倒序排列
for i in $(seq 1 2 10) 1-10的奇数,中间为步长
#!/bin/bash
#for循环倒取0到20的偶数
for i in {20..0..2}
do
echo $i
done
echo "一下是奇数:"
#for循环取0到20的奇数
for i in {1..20..2}
do
echo $i
done
eg2:
1.2.4 不带列表循环
执行时由用户指定参数和参数的个数决定的
for 变量名
do
command
done
eg1:
eg2:
[root@zhang ~]# vim for2.sh
#!/bin/bash
for i
do
echo hello
done
[root@zhang ~]# . for2.sh //没有给脚本传参所以执行了没有结果
[root@zhang ~]# . for2.sh a //把a赋值给变量i,i有值了它就开始执行do..done了
hello
1.2.5 批量创建用户,并设置密码
1.2.6 根据ip地址列表检查主机状态
1.2.7 判断密码输入是否正确!
1.2.8 幸运会员抽奖
1.3 类C风格的for循环
格式:
for ((expr1;expr2;expr3))
do
command
done
expr1:定义变量并赋初值
expr2:决定是否循环
expr3:决定循环变量如何改变,决定循环什么时候退出
1.3.1 显示输出1-5
#!/bin/bash
for((i=1;i<=5;i++)) #此时你要注意只要有i++ 就要有两个括号
do
echo $i
done
1.3.2 嵌套循环 星星的格式
#!/bin/bash
read -p "请输入星星的规格:" start
for ((i=1;i<=$start;i++))
do
for ((j=1;j<=$start;j++))
do
echo -n "*"
done
echo
done
把星星变成三角形的格式:
#!/bin/bash
read -p "请输入星星的规格:" start
for ((i=1;i<=$start;i++))
do
for ((j=1;j<=$i;j++))
do
echo -n "*"
done
echo
done
1.3.3 9 9乘法表
#!/usr/bin/env bash
for ((a=1;a<=9;a++))
do
for ((b=1;b<=9;b++))
do
if [[ a -ge b ]];then
echo -n "$b*$a=$[a*b] "
fi
done
echo " "
done
#!/usr/bin/env bash
for ((b=1;b<=9;b++))
do
for ((a=1;a<=9;a++))
do
if [[ a -ge b ]];then
echo -n "$b*$a=$[a*b] "
fi
done
echo " "
done
1.3.4 随机生成密码(达到一定复杂度)
#!/bin/bash
key="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ@#¥%%…………&&**(())————+"
num=${#key}
pass=''
for i in {1..6}
do
index=$[RANDOM%num]
pass=$pass${key:$index:1}
done
echo "随机生成的密码时:$pass"
法二:随机生成密码
#!/bin/bash
mkpasswd -l 6 -s 1 -C 1 -c 1 -d 1
# -c:定义在密码中小写字母字符的最小数目,默认值是2
# -C:定义在密码中大写字母字符的最小数目,默认值是2
# -s:定义在密码中特殊字符的最小数目,默认值是1
# -p:指定程序来设置密码,默认情况下,如果存在使用/etc/yppasswd,否则使用/bin/passwd
# -d:定义密码的最小数目,默认值为2
# -l:定义口令的长度,默认值为9
二.while语句
1、语法结构
while循环一般用于有条件判断的循环,若判断条件为真,则进入循环,当条件为假就跳出循环
先定义一个变量
while 表达式(条件)
do
循环语句命令
done
2.1 经典案例
2.1.1 打印1-5
[root@zhang ~]# vim while.sh
#!/bin/bash
i=1
while [ $i -le 5 ]
do
echo $i
let i++ //注意这里如果不改变$i的值,会变成死循环
done
let :相当于 简单的计算器
**语 法**
let[计算表达式]
**功 能**
let 命令:是 BASH中用于计算的工具,提供常用运算符还提供了方幂“**”运算符。在变量的房屋计算中不需要加上$来表示变量,如果表达式的值是非0,那么返回的状态值是0;否则,返回的状态值是1
2.1.2 输出1到100能被3整除的数字
#!/bin/bash
i=1
while [ $i -le 100 ]
do
if [[ $i%3 -ne 0 ]]
then
echo "$i"
fi
let i++
done
2.2.3 开启apache服务
#!/bin/bash
while ps aux |grep httpd |grep -v grep &>/dev/null
#ps aux 动态查找所有进程 grep httpd :过滤显示出带有httpd字段的 最>后 -v:取反 反向查找,过滤掉带有grep字段的
do
echo "Apache 服务正在运行中"
sleep 2 #睡眠两秒
done
echo "Apache 服务不在运行,请查看服务是否出现故障"
2.2.4 猜数字的案例,猜不对就一直猜,猜对了退出
while里面解决死循环的方法,用break退出循环
#!/bin/bash
cnum=520
while true
do
read -p "请输入数字:" num
if [ $num -eq $cnum ];then
echo "你猜对了!"
break
elif [ $num -gt $cnum ];then
echo "你猜的数字过大啦!"
elif [ $num -lt $cnum ];then
echo "你猜的数字过小啦!"
fi
done
2.2.5 猜商品价格
[root@localhost ~]# cat test7.sh
#!/bin/bash
PC=`expr $RANDOM % 1000`
a=0
echo "商品实际价格范围0-999,请猜猜看是多少?"
while true
do
read -p "请输入你猜的价格数目:" num
let a++
if [ $num -eq $PC ];then
echo "恭喜你答对了,实际价格是 $PC "
echo "你总共猜了$a次"
exit 0 #退出
elif [ $num -gt $PC ];then
echo "小可爱,你猜高啦!"
else
echo "小可爱,你猜低啦!"
fi
done
2.2.6 监控系统资源中的内存和硬盘空间
#!/bin/bash
disk_size=$( df / |awk '///{print $4 }') #硬盘的可用空间
Mem_size=$(free | awk '/Mem/{print $4}') #分区的可用空间
while
do
if [ $disk_size -le 2560000 -a $Mem_size -le 102400 ];then
mail -s Warning root <<EOF
内存和硬盘空间不足请尽快处理!
EOF
#EOF是免交互模式,直接把东西传给邮箱进行警告#注意EOF必须要顶格写才能成功
fi
Done
2.2.7 break与continue的区别
#break 3 表示单个循环后面数字3表示跳出三层循环
#continue 表示终止每次循环的命令,但是不会完成终止命令
1.break
2.break
2.2.8 商店购物 并打折
#!/bin/bash
i=1
sum=0
while [ $i -le 5 ]
do
echo "本公主今天宠爱第$i家商店呢"
read -p "是否进入看看(yes/no)" doing
while [ $doing = "yes" ]
do
echo "1:衣服 ¥200"
echo "2:鞋子 ¥150"
echo "3:帽子 ¥50"
echo "4:裤子 ¥165"
read -p "请选择需要购买的商品序列号:" num
case $num in
1)
echo "衣服购买成功!"
expr $[ sum+=200 ] &> /dev/null
;;
2)
echo "鞋子购买成功!"
expr $[ sum+=150 ] &> /dev/null
;;
3)
echo "帽子购买成功!"
expr $[ sum+=50 ] &> /dev/null
;;
*)
echo "裤子购买成功!"
expr $[ sum+=165 ] &> /dev/null
;;
esac
read -p "是否继续进行购买(yes/no)" doing
done
let i++
if [ $doing = "no" ]
then continue
fi
done
echo "今天您的购物总价为:$sum"
if [ $sum -ge 150 ] && [ $sum -lt 200 ];then
let sum=sum-50
elif [ $sum -ge 200 ] && [ $sum -le 400 ];then
let sum=$sum-100
fi
echo "打折之后的价格为:$sum"
三. until 循环语句结构
用法: 重复测试某个条件,只要条件不成立则反复执行
只要while后面的命令
退出状态为0,while循环就一直执行下去
,until命令与while命令相似,唯一的区别在于
,只要until后面的命令退出不为0,until循环就一直执行下去,也就是说,使用until语句重复执行一段代码直到条件为真为止,与while类似
格式:
until 条件测试操作
do
命令序列
done
3.1 计算0-50的和?
通过循环累加的方式计算1-50的和
#!/bin/bash
#功能1:0-50的和是多少?
#i=0;s=0
#until [ $i -eq 51 ]
#do
# let s+=i
# let i++
#done
#echo $s
福利待遇:编写脚本的思路
1.首先明确脚本的功能
1.1案例:需求是创建用户并测试用户20个
->那肯定要用循环for、 while
->知道需求含义来定义脚本的功能
2.编写脚本时会使用到哪些命令?
2.1如上面的需求:就要使用useradd passwd let echo for while 等命令
3.把变化的数据使用变量表示【记得要先定义哦】
3.1固定长的定义变量、经常调用的参数可设变量
3.2变化的定义变量
4.选择适合的流程控制
4.1【循环语句、双分支、多分支、case等一些控制语句 】
喜欢小编就给我点个赞吧!
最后
以上就是结实鸡为你收集整理的shell脚本(三)——循环语句之for、while语句一.for循环语句二.while语句三. until 循环语句结构福利待遇:编写脚本的思路的全部内容,希望文章能够帮你解决shell脚本(三)——循环语句之for、while语句一.for循环语句二.while语句三. until 循环语句结构福利待遇:编写脚本的思路所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复