目录
一、for 循环语句
1、语法结构
(1)列表循环
(2)不带列表循环
(3)类C风格的for循环
格式:
for 变量名 in 取值列表
do
命令序列
done
for ( (expr1;expr2;expr3))
do
command
done
expr1:定义变量并赋初值
expr2:决定是否循环
expr3:决定循环变量如何改变,决定循环什么时候退出
2、用法
读取不同的变量值,用来逐个执行同一组命令
for循环经常使用在已经知道要进行多少次循环的场景
3、例子
打印1到5
[root@ky19cl for]# for i in {1..5}
> do
> echo $i
> done
1
2
3
4
5
[root@ky19cl for]# for i in `seq 5`
> do
> echo $i
> done
1
2
3
4
5
打印0到50的偶数
#!/bin/bash
for i in {0..50..2] #..2代表步长为2,每隔2个
do
echo $i
done
1到10的偶数和
#/bin/bash
sum=0
for i in {0..10..2}
do
sum=$[sum+i]
let i++
done
echo "10以内的偶数和为:$sum"
小知识点:
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的奇数,中间为步长
for i in s (seq 0 2 10) 1-10的偶数,中间为步长
循环输出1到5
#!/bin/bash
for ((i=1;i<=5;i++) )do
echo $i
done
注:
i++ : i=1+1 先赋值再运算 i=1 之后再 +1
++i : 1+1=i 先运算再赋值 1+1 之后再 =i
批量创建用户
方法一:
#!/bin/bash
for i in {1..5}或`seq 5`
do
useradd cl$i
echo "123456" | passwd --stdin cl$i
done
方法二:
先创建一个名单为users.txt在home目录下
#!/bin/bash
UL=$(cat /home/users.txt)
for UNAME in $UL
do
useradd $UNAME
echo "123456" | passwd --stdin $UNAME &>/dev/null
done
批量删除用户
#!/bin/bash
UL=$(cat /home/users.txt)
for UNAME in $UL
do
userdel -r $UNAME &>/ dev/ null
done
根据IP地址列表检查主机状态
-c发送包的数量
-i发送ping包间隔
-W超时时间
创建一个ip.txt文档在home目录下
#!/bin/bash
HLIST=$(cat /home/ip.txt)
for IP in $HLIST
do
ping -c 3 -i 0.2 -W 3 $IP &> /dev/null
if [ $? -eq 0 ];then
echo "Host $IP is up."
else
echo "Host $IP is down . "
fi
done
#!/bin/bash
network="192.168.10"
for addr in { 1..254 }
do
ping -c 2 -i 0.5 -w 3 $network.$addr &> /dev/null
if [ $? -eq 0 ] ;then
echo " $network. $addr is up"
else
echo "$network.$addr is down"
fi
done
密码验证,允许输入三次密码
#!/bin/bash
init=123456
for i in {1. .3}
do
read -p "请输入密码:" pass
if [ $pass == $init ] ; then
echo “密码正确"
exit
fi
done
echo“警告:密码错误"
抽奖次数
[root@ky19cl for]# vim chouhuiyuan.sh
#!/bin/bash
a=0
b=0
c=0
d=0
for ((i=1;i<=10;i++))
do
num=$(expr $[RANDOM%4+1])
LIST=$(cat user.txt |grep "$num" | awk -F: '{print $2}')
case $LIST in
cl)
let a++
;;
xlm)
let b++
;;
zzl)
let c++
;;
*)
let d++
;;
esac
done
echo "cl: $a次、 xlm:$b次、zzl:$c次、其他:$d次 "
循环嵌套
九九乘法表
#!/bin/bash
for ((x=1;x<=9;x++))
do
for ((y=1;y<=9;y++))
do
[ $y -le $x ] && echo -n " $x*$y=`echo $(($x*$y))` "
done
echo ""
done
打印星星
#!/bin/bash
#set -x
read -p "请输入星星的规格:" star
for ((i=1;i<=$star;i++))
do
for ((j=1;j<=i;j++))
do
echo -n "* "
done
echo
done
二、while 循环语句
1、while循环
一般用于有条件判断的循环,若判断条件为真,则进入循环,当条件为假就跳出循环
2、用法
重复测试某个条件,只要条件成立则反复执行
常在不知道范围的时候成立
格式:
while 条件测试操作
do
命令序列
done
3、例子
打印1到5,最后输出为6
#!/bin/bash
i=1
while [ $i -le 5 ]
do
echo $i
let i++ #注意这里如果不改变$i的值,会变成死循环
#i=$[$i+1] //两种写法
done
echo "最后i的值为: $i"
100内不能被3整除
#!/bon/bash
i=1
while [ $i -le 100 ]
do
if [[ $i%3 -ne 0 ]]; then
echo "$i"
fi
let i++
done
查看服务是否正常
#!/bin/bash
while ps aux | grep httpd | grep -v grep &> /dev/null
do
echo "httpd服务正在运行中"
sleep 2
exit
done
echo "httpd服务不在运行中,查看是否有故障"
while死循环
猜价格一
猜价格二
PC=`expr $RANDOM % 1000`
a=0
echo "猜价格0-999"
while true
do
read -p "请输入猜的价格:" num
let a++
if [ $num -eq $PC ];then
echo "恭喜你,猜对了,价格为$num"
echo "猜了$a次"
exit 0
elif [ $num -gt $PC ];then
echo "猜高了"
else
echo "猜低了"
fi
done
创建20个用户
#!/bin/bash
USERS="cl"
i=1
while [ $i -le 20 ]
do
useradd ${USERS}$i
echo "123456" |passwd --stdin ${USERS}$i
let i++
done
实时监控本机内存和硬盘剩余空间,剩余内存小于500M、根分区剩余空间小于1000M 时,发送报警邮件给 root 管理员
#!/bin/bash
#提取根分区剩余空间
disk_size=$(df / |awk '/\//{print $4}')
#提取内存剩余空间
mem_size=$(free |awk '/Mem/{print $4}')
while :
do
#注意内存和磁盘提取的空间大小都是以Kb 为单位
if [ $disk_size ‐le 512000 -a $mem_size ‐le 1024000 ];then
mail ‐s Warning root <<EOF
Insufficient resources,资源不足
EOF
fi
done
逛商店
#!/bin/bash
sum=0
i=1
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"
三、until 循环语句
跟while相反,条件为假进入循环,条件为真退出循环
用法: 重复测试某个条件,只要条件不成立则反复执行
例子:
计算1到51的和
#!/bi/bash
set -x
i=0
s=0
until [ $i -eq 51 ]
do
let s=s+i
let i++
done
echo $s
用户案例
#!/bin/bash
username=$1
#判断信息格式
if [ $# -lt 1 ];then
echo "Usage:`basename $0` <username> [<message>]"
exit 1
fi
#判断用户是否存在
if grep "^$username:" /etc/passwd >/dev/null ;then :
else
echo "用户不存在"
exit 1
fi
#用户是否在线,如果不在线每5秒联系一次
until who|grep "$username" >/dev/null
do
echo "用户不存在"
sleep 5
done
mes=$*
echo $mes | write $username
注:测试时切换下用户
四、循环控制语句
1、continue
终止每次循环中的命令,但不会完全终止命令
#!/bin/bash
for ((i=1;i<=5;i++))
do
if [ $i -eq 3 ];then
continue
else
echo $i
fi
done
结果是1245,3不输出,因为跳出后面的echo语句执行下一次循环了
2、break
打断,马上停止本次循环,执行循环体外的代码
1-10的数字,7后面的都不打印
#!/bin/bash
for ((i=1;i<=10;i++))
do
if [ $i -eq 8 ];then
break
else
echo $i
fi
done
1-10的数字,7后面的都不打印
3、exit
直接跳出程序,后面可跟状态返回码如 exit 1
#!/bin/bash
for i in {1..5}
do
if [ $i -eq 3 ];then
exit 1
else
echo $i
fi
done
echo $i
exit 数字
echo $?可以查看
嵌套循环例子跳出多层循环
#!/bin/bash
for ((a=1;a<=3;a++))
do
echo "outer loop: $a"
for ((b=1;b<=4;b++))
do
if [ $b -eq 3 ];then
continue 2
#break 2
fi
echo "inter loop: $b"
done
done
continue与continue 2
break与break 2
总结
编写脚本的思路
1、明确脚本的功能实现功能
比如:需求创建测试用户20个
2、编写脚本时会使用到哪些命令?
useradd、 paswwd 、for、 let、 echo
3、把变化的数据使用变量表示
- 固定长的定义变量、经常调用参数可设变量
- 变化的定义变量
4、选择适合的流程控制语句,循环、双分支、多分支、case等