1、for语句
(1)for结构
需要指定一个变量及可能的取值列表,针对每个不同的取值重复执行相同的命令序列。直到变量值用完退出循环需要预先指定
for 变量名 in 取值列表
do
命令序列
done
(2) 应用示例
根据姓名列表添加与删除账户
指定员工列表文件users.txt,重复执行添加用户,设置初始化密码
添加
vim /root/users.txt (用作测试的列表文件)
(添加三个用户)
LS
QY
AS
vim uaddfor.sh
#!/bin/bash
A=$(cat /root/users.txt)
for B in $A
do
useradd $B
echo "000000" | passwd --stdin $B &> /dev/null (把每个用户的密码设置为000000)
done
chmod +x uaddfor.sh
./uaddfor.sh
tail -3 /etc/passwd (查看新建用户)
su 用户名 (测试登录用户)
批量删除用户的脚本
vim uaddfor.sh
#!/bin/bash
A=$(cat /root/users.txt)
for B in $A
do
userdel -r $B &>/dev/null
done
chmod +x uaddfor.sh
./uaddfor.sh
tail -3 /etc/passwd (再次查看用户以删除)
根据IP地址列表检查主机状态
从ipadds.txt文件中读取各服务器的IP地址,重复执行ping连通性测试,并根据测试结果输
出相应的提示信息。
vim /root/ipadds.txt (用做测试的列表文件)
192.168.1.10
192.168.1.20
192.168.1.30
vim ping.sh (循环检查各主机的脚本)
#!/bin/bash
A=$(cat /root/ipadds.txt)
for IP in $A
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
chmod +x ping.sh
./ping.sh
2、while 循环语句
要求控制循环次数、操作对象按数字顺序编号、按特定条件执行重复操作等情况。则更适合使用
另外一种循环-while语句。
(1)while语句结构
while 条件测试操作
do
命令序列
done
使用while循环语句时。有两个特殊的条件测试操作,即true(真)和false(假)。使用true作
为条件时.表示条件永远成立。循环体内的命令序列将无限执行下去,除非强制终止脚本exit语句退出脚本);反之,若使用false作为条件。则循环体将不会被执行。这两个特殊条件也可以
用在if语句的条件测试中。
(2)while语句应用示例
批量添加与删除规律编号的用户
递增20个用户
添加
vim uaddwhile.sh
#!/bin/bash
A="user"
i=1 (控制用户名称的编号,初始赋值为1)
while [ $i -le 20 ]
do
useradd ${A}$i
echo "000000" | passwd --stdin ${A}$i &> /dev/null
let i++ (等同于 i= expr $i +1 使变量i的值增加1)
done
chmod +x uaddwhile.sh
./uaddwhile.sh
grep "user" /etc/passwd | tail -3 (查看最后三行是否递增用户为20个)
删除
vim uaddwhile.sh
#!/bin/bash
A="user"
i=1
while [ $i -le 20 ]
do
userdel -r ${A}$i
let i++
done
./uaddwhile.sh
id user20
显示无此用户则成功
猜价格游戏
由脚本预先生成一个随机的价格数目(0-999)作为实际价格,判断用户猜测
通过环境变量RANDOM 可获得一个小于2的16次方的随机整数
计算其与1000的余数即可获得0-999的随机价格
反复猜测操作可以通过以true作为测试条件的while循环实现
当用户猜中实际价格时终止循环:判断猜测价格与实际价格的过程采用if语句实现,嵌
套在while循环体内;使用变量来记录猜测次数.
vim jiage.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 "你总共猜测了$TIMES 次"
exit 0
elif [ $INT -gt $PRICE ]
then
echo "太高了!"
else
echo "太低了!"
fi
done
chmod +x jiage.sh
./jiage.sh (执行命令后会提前输入0-999之前的数字)