前言:这一章呢稍微有点繁琐,和拐友们玩一下for循环语句,因为接下来的代码更加的繁琐和困难,if语句已经不够用啦,所以我们这章来玩一下for循环语句,它可以极大的减轻我们的负担。
目录
一.for循环语句
1.1for语句的用法
1.2for语句的格式
1.3for语句实验之=简单案列
1.3.1显示打印出字母和数字
1.3.2调用显示i的值
1.3.3输出0到50之间的偶数和奇数
1.3.4.不带列表循环执行时由用户指定参数和参数的个数决定的
1.4批量创建用户脚本
1.5根据ip地址列表检查主机状态
1.6 判断密码输入是否正确!
1.7幸运会员大抽奖
二.类似C风格的for循环
2.1for循环格式
2.2显示输出1-5
2.3嵌套 循环星星的格式
2.4九九乘法表
2.5随机生成密码(要达到一定的复杂程度)
三.while语句
3.1while语句的案例
3.1.1打印1-5
3.1.2输出1到100能被3整除的数字
3.1.3开启apache服务
3.1.4猜数字游戏,猜不对就一直猜,猜对了退出
3.1.5 break 和 continue的区别
3.1.6猜商品价格
3.1.7监控系统资源中的内存和硬盘空间
3.1.8商场购物
四.until 循环语句结构
4.1计算0-50的和
五.Shell函数
5.1Shell函数的基本格式
5.2函数返回值
用法:
1.读取不同的变量值,用来逐个执行同一组命令
2.for循环经常使用在已经知道要进行多少次循环的场景
3.使用for循环语句时,需要指定一个变量及可能的取值列表,针对每一个不同的取值重复执行相同的命令序列,直到变量值用完退出循环。在这里,“取值列表”称为for语句的执行条件,其中包括多个属性相同的对象,需要预定指定。
for 变量名 in 取值列表 #变量名=变量值
do
命令序列
done
1.for i in `seq 5` //seq 6=1、2、3、4、5序列
2.do
3 echo $i
4.done
或者
1.for i in a b c //这里调用到i变量了,所以就正常显示i的值(a\b\c)
2.do
3. echo $i
4.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倒序排列
for i in $(seq 1 2 10) 1-10的奇数,中间为步长
#!/bin/bash
#for循环倒取0到50的偶数
for i in {50..0..2}
do
echo $i
done
echo "一下是奇数:"
#for循环取0到50的奇数
for i in {50..1..2}
do
echo $i
done
第二种方法:
不带列表循环
执行时由用户指定参数和参数的个数决定的
1.for 变量名
2.do
3. command
4.done
脚本:
结果
1.[root@localhost ~]# vim /root/yonghu.txt
2.liunan
3.chenchen4.guanchen
5.liufeng
6.taojian
7.hehe
8.[root@localhost ~]# vim /root/yonghu.txt
9.#!/bin/bash
10.ULIST=`cat /root/yonghu.txt`
11.for UNAME in $ULIST
12.do
13. useradd $UNAME
14. echo "123456" |passwd --stdin $UNAME &>/dev/null
15.done
检测主机的状态:
1.for ((expr1;expr2;expr3))
2.do
3. command
4.done
1.expr1:定义变量并赋初值
2.expr2:决定是否循环
3.expr3:决定循环变量如何改变,决定循环什么时候退出
#!/bin/bash
for((i=1;i<=5;i++)) #此时你要注意只要有i++ 就要有两个括号
do
echo $i
done
1.#!/bin/bash
2.read -p "请输入星星的规格:" start
3.for ((i=1;i<=$start;i++))
4.do
5. for ((j=1;j<=$start;j++))
6. do
7. echo -n "*"
8. done
9.echo
10.done
也可以把星星变成三角形的格式:
1.#!/bin/bash
2.read -p "请输入星星的规格:" start
3.for ((i=1;i<=$start;i++))
4.do
5. for ((j=1;j<=$i;j++))
6. do
7. echo -n "*"
8. done
9.echo
10.done
1.#!/usr/bin/env bash
2.for ((a=1;a<=9;a++))
3.do
4. for ((b=1;b<=9;b++))
5. do
6. if [[ a -ge b ]];then
7. echo -n "$b*$a=$[a*b] "
8. fi
9. done
10. echo " "
11.done
也可以把它变成倒三角
1.#!/usr/bin/env bash
2.for ((b=1;b<=9;b++))
3.do
4. for ((a=1;a<=9;a++))
5. do
6. if [[ a -ge b ]];then
7. echo -n "$b*$a=$[a*b] "
8. fi
9. done
10. echo " "
11.done
1.#!/bin/bash
2.key="0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ@#¥%%…………&&**(())————+"
3.num=${#key}
4.pass=''
5.for i in {1..8}
6. do
7. index=$[RANDOM%num]
8. pass=$pass${key:$index:1}
9. done
10.echo "随机生成的密码时:$pass"
方法二:随机生成密码
1.#!/bin/bash
2.mkpasswd -l 6 -s 1 -C 1 -c 1 -d 1
3.# -c:定义在密码中小写字母字符的最小数目,默认值是2
4.# -C:定义在密码中大写字母字符的最小数目,默认值是2
5.# -s:定义在密码中特殊字符的最小数目,默认值是1
6.# -p:指定程序来设置密码,默认情况下,如果存在使用/etc/yppasswd,否则使用/bin/passwd
7.# -d:定义密码的最小数目,默认值为2
8.# -l:定义口令的长度,默认值为99.# mkpasswd命令的作用:可以生成应用用户的新密码:选择将其应用于用户。
1.for循环语句非常适用于列表对象无规律,且列表来源已固定(如某个列表文件)的场合。而对于要求控制循环次数、操作对象按数字顺序编号、按特定条件执行重复操作等情况,则更适合使用另一种循环—while语句。
2.while循环一般用于有条件判断的循环,若判断条件为真,则进入循环,当条件为假就跳出循环
while循环的用法:
1.先定义一个变量
2.while 表达式(条件)
3.do
4. 循环语句命令
5.done
[root@localhost~]# vim while.sh
#!/bin/bash
i=1
while [ $i -le 5 ]
do
echo $i
let i++ //注意这里如果不改变$i的值,会变成死循环
done
ps注意:
let :相当于 简单的计算器
1.**语 法**
2.let[计算表达式]
3.**功 能**
4.let 命令:是 BASH中用于计算的工具,提供常用运算符还提供了方幂“**”运算符。在变量的房屋计算中不需要加上$来表示变量,如果表达式的值是非0,那么返回的状态值是0;否则,返回的状态值是1
1.#!/bin/bash
2.i=1
3.while [ $i -le 100 ]
4.do
5. if [[ $i%3 -ne 0 ]]
6. then
7. echo "$i"
8. fi
9. let i++
10.done
1.#!/bin/bash
2.while ps aux |grep httpd |grep -v grep &>/dev/null
3. #ps aux 动态查找所有进程 grep httpd :过滤显示出带有httpd字段的 最>后 -v:取反 反向查找,过滤掉带有grep字段的
4. do
5. echo "Apache 服务正在运行中"
6. sleep 2 #睡眠两秒
7. done
8.echo "Apache 服务不在运行,请查看服务是否出现故障"
1.#!/bin/bash
2.cnum=520
3.while true
4.do
5.read -p "请输入数字:" num
6. if [ $num -eq $cnum ];then
7. echo "你猜对了!"
8. break
9. elif [ $num -gt $cnum ];then
10. echo "你猜的数字过大啦!"
11. elif [ $num -lt $cnum ];then
12. echo "你猜的数字过小啦!"
13. fi
14.done
continue 语句和 break 语句的区别是,continue 语句只结束本次循环,而不是终止整个循环。break 语句则是结束整个循环过程,不再判断执行循环的条件是否成立,并执行当前循环之后的语句。而且,continue 只能在循环语句中使用,即只能在 for、while 和 do…while 中使用,除此之外 continue 不能在任何语句中使用
简单来说:
1.continue 终止每次循环中的命令,但是不会完全终止循环
2.break 跳出单个循环,仅在”for“”while“或”until“循环中有意义。
continue:
break:
1.[root@localhost ~]# cat test7.sh
2.#!/bin/bash
3.PC=`expr $RANDOM % 1000`
4.a=0
5.echo "商品实际价格范围0-999,请猜猜看是多少?"
6.while true
7.do
8.read -p "请输入你猜的价格数目:" num
9.let a++
10.if [ $num -eq $PC ];then
11. echo "恭喜你答对了,实际价格是 $PC "
12. echo "你总共猜了$a次"
13. exit 0 #退出
14.elif [ $num -gt $PC ];then
15. echo "你猜高啦!"
16. else
17. echo "你猜低啦!"
18.fi
19.done
#!/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 <
#!/bin/bash
i=1
sum=0
while [ $i -le 3 ]
do
echo "进入第$i家商店"
read -p "是否进入看看(yes/no)" doing
while [ $doing = "yes" ]
do
echo "1:衣服 ¥2000000"
echo "2:鞋子 ¥1000000"
echo "3:帽子 ¥1200000"
echo "4:裤子 ¥1500000"
read -p "请选择你需要购买的商品的序列号:" num
case $num in
1)
echo "衣服购买成功"
expr $[sum+=2000000] &>/dev/null
;;
2)
echo "鞋子购买成功"
expr $[sum+=1000000] &>/dev/null
;;
3)
echo "帽子购买成功"
expr $[sum+=1200000] &>/dev/null
;;
*)
echo "裤子购买成功"
expr $[sum+=1500000] &>/dev/null
esac
read -p "是否进行购买(yes/no)?" doing
done
let i++
if [ $doing = "no" ]
then continue
fi
done
echo "购物总价为:$sum"
用法: 重复测试某个条件,只要条件不成立则反复执行
只要while后面的命令退出状态为0,while循环就一直执行下去,until命令与while命令相似,唯一的区别在于,只要until后面的命令退出不为0,until循环就一直执行下去,也就是说,使用until语句重复执行一段代码直到条件为真为止,与while类似
until 条件测试操作
do
命令序列
done
1.#!/bin/bash
2.#功能1:0-50的和是多少?
3.#i=0;s=0
4.#until [ $i -eq 51 ]
5.#do
6. # let s+=i
7. # let i++
8.#done
9.#echo $s
[function] 函数名(){
命令序列
[return x] #使用return或exit可以显示的结束函数
}
或者
#也可以省略掉[function],它表示该函数的功能
函数名() { #函数名后面()是没有内容的
命令序列 #我们执行的命令内容放在{}里面
}
1.函数定义完之后并不会自动执行,需要调用才行
2.好处在于可以写一段功能代码作为函数,有需要就直接调用定义的时候哪怕出现语法错误也没关系,不调用就不会报错
3.当然我们写函数最终目的还是为了调用,为了实现某个功能块。
return表示退出函数并返回一个退出值,脚本中可以用$? 变量显示该值使用原则
1.函数一结束就取返回值,因为$?变量只返回执行的最后一条命令的退出状态码
2.退出状态码必须是0~255,超出时值将为256取余