Shell循环语句
for循环语句
读取不同的变量值,用来逐个执行同一组命令
格式
for 变量名 in 取值列表
do
命令序列
done
使用规则
使用for循环语句时,需要指定一个变量及可能的取值列表, 针对每个不同的取值重复执行相同的命令序列,直到变量值使用完退出循环。在这里,“取值列表”称为 for 语句的执行条件,其中包括多个属性相同的对象,需要预先指定(如通讯录,IP,黑名单)
项目示例
根据姓名列表创建账户
[root@server2 ~]# vim users.txt 创建用户列表
[root@server2 ~]# vim useradd.sh
#!/bin/bash
# 添加新用户
ulist=$(cat /root/users.txt)
for uname in $ulist
do
if [ $uname == `grep $uname /etc/passwd | awk -F: '{print $1}'`]
then echo "姓名重复"
fi
useradd $uname
echo "123456" | passwd -- stdin $uname &> /dev/null
done
[root@server2 ~]# chmod +x useradd.sh
[root@server2 ~]# ./useradd.sh
删除用户保留文件
[root@server2 ~]# vi user1.txt 创建要删除账户的列表
[root@server2 ~]# vim usrdel.sh
#!/bin/bash
# 删除用户及用户所在的宿主目录
ulist=$(cat /root/user1.txt)
for uname in $ulist
do
a=`ls -lh /home/$uname | awk '{print $2}'`
if [ "$a" != "0" ]
then cp -r /home/$uname /userfile_backup
fi
userdel -r $uname &> /dev/null
done
[root@server2 ~]# mkdir /userfile_backup 创建用于备份删除账户的文件
[root@server2 ~]# chmod +x usrdel.sh
[root@server2 ~]# ./usrdel.sh
[root@server2 ~]# id zhangsan 查看被删除用户是否还在
[root@server2 ~]# cd /userfile_backup/ 查看删除用户的用户文件是否还在
[root@server2 userfile_backup]# ls -lh
检查主机在线状态
[root@server2 ~]# vi ipadd.txt 创建检测主机地址
192.168.10.10
192.168.10.66
192.168.10.200
[root@server2 ~]# vim ip_test.sh
#!/bin/bash
# 测试主机是否在线
hlist=$(cat /root/ipadd.txt)
for ip in $hlist
do
ping -c 3 -i 0.2 -W3 $ip &> /dev/null ping 地址
if [ $? -eq 0 ] $?为0,成立
then echo "$ip is up." 在线
else echo "$ip is down."
fi
done
[root@server2 ~]# chmod +x ip_test.sh
[root@server2 ~]# ./ip_test.sh
计算加班工资
[root@server2 ~]# vi jiaban.txt 创建加班名单
[root@server2 ~]# vim jiabanday.sh
#!/bin/bash
# 加班工资
base_money=5000
list=$(cat /root/jiaban.txt)
for user in $list
do
money=$(expr $base_money + 300)
echo "$user salary is $money"
done
[root@server2 ~]# sh jiabanday.sh
[root@server2 ~]# vim jiabanall.sh
#!/bin/bash
# 加班工资
base_money=5000
for user in $1
do
money=$(expr $base_money + 300 \* $2)
echo "$user salary is $money"
done
[root@server2 ~]# chmod +x jiabanall.sh
[root@server2 ~]# ./jiabanall.sh
while循环
重复测试某个条件,只要条件成立则反复执行
格式
while 条件测试操作
do
命令序列
done
对比for循环
for循环语句非常适用于列表对象无规律,且列表来源已固定(如某个列表文件)的场合。而对于要求控制循环次数,操作对象按数字顺序编号,按特定条件执行重复操作等情况,则更适合使用另外一种循环------while语句。
使用规则
可以根据特定的条件反复执行一个命令序列,直到该命令不再满足时为止,当测试条件不再成立,从而结束循环。
项目实例
添加多个新用户
[root@server2 ~]# vim use_while.sh
#!/bin/bash
i=1
while [ $i -le 20 ]
do
user="stu$i"
if [ $user == `grep $user /etc/passwd | awk -F: '{print $1}'` ]
then echo "姓名重复"
fi
useradd $user
echo "123456" | passwd --stdin $user &> /dev/null
let i++
done
[root@server2 ~]# chmod +x use_while.sh
[root@server2 ~]# ./use_while.sh
删除用户
[root@server2 ~]# vim userdel_while.sh
#!/bin/bash
i=1
while [ $i -le 20 ]
do
uname="stu$i"
a=`ls -lh /home/$uname | awk '{proint $2}'`
if [ "$a" != "0" ]
then cp -r /home/$uname /userfile_backup
fi
userdel -r $uname
let i++
done
[root@server2 ~]# sh userdel_while.sh
[root@server2 ~]# tail /etc/passwd
[root@server2 ~]# tail -3 /etc/passwd
猜价格游戏
[root@server2 ~]# vim pricegame.sh
#!/bin/bash
# 竞猜价格
price=$(expr $RANDOM % 1000)
times=0
echo "商品实际价格范围为0-999,猜猜看是多少?"
while true
do
read -p "请输入您竞猜的价格?" int
let times++
if [ $int -eq $price ]
then echo “恭喜你猜对了,实际价格是$price”echo “你一共猜了$time次”;break
elif [ $int -gt $price ]
then echo “太高了”
else
echo “太低了”
fi
done
[root@server2 ~]# chmod +x pricegame.sh
[root@server2 ~]# ./pricegame.sh
until循环
重复测试某个条件,只要条件不成立则反复执行
格式
until 条件测试操作
do
命令序列
done
对比while循环
until循环与while循环类型,while循环能实现的脚本until同样可以实现,但区别是while循环在条件为真时继续执行循环,而until则是在条件为假时执行循环。
项目示例
求和
[root@server2 ~]# vim sum_while.sh
#!/bin/bash
i=0
s=0
until [ $i -eq 50 ]
do
let i=$i+1
let s=$s+$i
done
echo "1-50的和为:" $s
[root@server2 ~]# chmod +x sum_while.sh
[root@server2 ~]# ./sum_while.sh