while循环
循环语句常用于重复执行一条指令或一组指令,直到条件不满足停止,shell脚本语言的循环语句常见的有while、until、for、select循环语句,其中,until和select已经基本淡出历史舞台。本章讲while循环
while循环语句主要用来重复执行一组命令会语句。在企业中常用于守护进程或持续运行的程序,也有时候会用while来读取文件的每一行内容
while语法
while循环的基本语法为:
while <条件表达式>
do
指令
done
或
while <条件表达式>;do
指令
done
while循环会对紧跟在while后的条件表达式判断,如果条件成立,就执行while里面的命令或语句,每次执行到done时候就重新判断while表达式是否真的成立,直到表达式不成立才退出while循环体,如果一开始就不成立,就不会进入循环体,
while循环执行的流程图如下所示:
while按行读入文件
while可以读取指定的文件:
cat方式
cat file | while read line
do
echo $line
done
<重定向输入方式(推荐使用的方式)
while read line
do
echo $line
done < file
练习:
while循环从1加到100,然后再额外使用两种方式计算1
while循环读入数据,计算文件内的年龄平均值
将第6章的练习1,改为死循环的形式。菜单中加入选项exit,只有输入exit才能退出
解决
while循环从1加到100,然后再额外使用两种方式计算1
a=0
sum=0
while [ $a -lt 100 ];do
let a++
let sum=$sum+$a
done
echo $sum
执行结果
[root@shell ~]# sh while.sh
5050
while循环读入数据,计算文件内的年龄平均值
a=0
sum=0
while read line;do
let a++
age=`echo $line|awk '{print $2}'`
let sum=$age+$sum
done<$1
echo $sum / $a|bc
操作结果
[root@shell /server/scripts]# cat nling.txt
xiaohong 22
xiaoli 23
xiaoming 33
xiaojuan 32
xiaoqiang 21
[root@shell /server/scripts]# sh age.sh nling.txt
26
案例实操
1、猜数字游戏:首先让系统随机生成一个数字,给这个数字定一个范围,让用户输入猜的数字,对输入的数字进行判断,如果不符合要求,就给与高或低的提示,猜对后给出猜对用的次数,请用while语句实现。
2、使用if和while实现菜单系统信息案例:
h 显示命令帮助
f 显示登录信息
d 显示磁盘挂载
m 查看内存使用
u 查看系统负载
q 退出程序
3、while循环案例,可以批量创建10个用户,并通过传参方式传入密码123
创建用户:
useradd test1
添加密码:
echo 123 | passwd --stdin test1
批量创建
seq 1 10
4、使用case和while循环批量删除用户[y|n]
5、while循环通过文本来直接创建用户和密码,如果用户存在或者创建失败给予提示
解决:
1、猜数字游戏:首先让系统随机生成一个数字,给这个数字定一个范围,让用户输入猜的数字,对输入的数字进行判断,如果不符合要求,就给与高或低的提示,猜对后给出猜对用的次数,请用while语句实现。
#生成随机数1-100
function game(){
mun=`echo $((RANDOM%100+1))`
coont=0
x=1
sleep 2
clear
echo "======* 欢迎玩家登录本游戏 *======"
echo "数字范围在 1-100之间"
echo "请输入你猜测的数字"
while [ "$x" -eq 1 ];do
read -p '请输入: ' m
let coont=$coont+1
if [ "$m" -gt "$mun" ];then
echo '猜大了!!!'
elif [ "$m" -lt "$mun" ];then
echo "猜小了!!!"
else
echo '恭喜你猜对了!本场游戏结束'
echo "你使用的次数是$coont"
x=2
fi
done
}
game
while true;do
echo "======* 是否开始新的游戏 Y or N *======"
read -p '请输入: ' n
if [[ "$n" = "Y" ]];then
game
elif [[ "$n" = "N" ]];then
echo "======* 退出游戏成功,恭候玩家下次登录游戏 *======"
exit 0
else
echo "输入有误请重新输入"
fi
done
执行结果
[root@shell /server/scripts]# sh caishuzhi.sh
======* 欢迎玩家登录本游戏 *======
数字范围在 1-100之间
请输入你猜测的数字
请输入: 44
猜小了!!!
请输入: 76
猜大了!!!
请输入: 55
猜小了!!!
请输入: 67
猜小了!!!
请输入: 73
恭喜你猜对了!本场游戏结束
你使用的次数是5
======* 是否开始新的游戏 Y or N *======
请输入: N
======* 退出游戏成功,恭候玩家下次登录游戏 *======
2、使用if和while实现菜单系统信息案例:
function menu(){
cat <<EOF
h 显示命令帮助
f 显示登录信息
d 显示磁盘挂载
m 查看内存使用
u 查看系统负载
q 退出程序
EOF
}
sleep 2
clear
menu
while true;do
danxitong.sh" 52L, 983C
elif [ "$m" = d ];then
echo '加载磁盘挂载信息'
sleep 1
who
fdisk -l
elif [ "$m" = m ];then
echo '加载内存使用情况'
sleep 1
free -m
elif [ "$m" = u ];then
echo '加载系统负载'
sleep 1
who
w
elif [ "$m" = q ];then
exit 1
else
echo '输入有误请重新输入'
fi
done
执行结果
[root@shell /server/scripts]# sh caidanxitong.sh
h 显示命令帮助
f 显示登录信息
d 显示磁盘挂载
m 查看内存使用
u 查看系统负载
q 退出程序
请选择你要选择的功能: f
加载登陆信息:
root pts/0 2019-07-20 12:53 (10.0.0.1)
root pts/1 2019-07-20 13:07 (10.0.0.1)
root pts/2 2019-07-20 13:31 (10.0.0.1)
请选择你要选择的功能: d
加载磁盘挂载信息
root pts/0 2019-07-20 12:53 (10.0.0.1)
root pts/1 2019-07-20 13:07 (10.0.0.1)
root pts/2 2019-07-20 13:31 (10.0.0.1)
Disk /dev/sda: 21.5 GB, 21474836480 bytes, 41943040 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk label type: dos
Disk identifier: 0x000e0dab
Device Boot Start End Blocks Id System
/dev/sda1 * 2048 2099199 1048576 83 Linux
/dev/sda2 2099200 4196351 1048576 82 Linux swap / Solaris
/dev/sda3 4196352 41943039 18873344 83 Linux
请选择你要选择的功能: m
加载内存使用情况
total used free shared buff/cache available
Mem: 972 98 752 7 121 728
Swap: 1023 0 1023
请选择你要选择的功能: u
加载系统负载
root pts/0 2019-07-20 12:53 (10.0.0.1)
root pts/1 2019-07-20 13:07 (10.0.0.1)
root pts/2 2019-07-20 13:31 (10.0.0.1)
13:45:39 up 51 min, 3 users, load average: 0.01, 0.02, 0.05
USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT
root pts/0 10.0.0.1 12:53 40:51 1.21s 0.59s vim nginx
root pts/1 10.0.0.1 13:07 3.00s 0.32s 0.00s w
root pts/2 10.0.0.1 13:31 13:47 0.07s 0.07s -bash
请选择你要选择的功能: h
加载菜单:
h 显示命令帮助
f 显示登录信息
d 显示磁盘挂载
m 查看内存使用
u 查看系统负载
q 退出程序
请选择你要选择的功能:q
3、while循环案例,可以批量创建10个用户,并通过传参方式传入密码123
read -p "请输入用户名的前缀: " m
read -p "请输入希望创建的用户数:" n
read -p "请输入用户的密码:" p
expr $n + 1 &> /dev/null
if [ $? -ne 0 ];then
echo "请输入正确的数字"
exit
fi
a=1
while [ $a -le $n ];do
user=$m$a
let a++
id $user &> /dev/null
if [ $? -eq 0 ];then
echo "用户" $user "已存在,创建失败"
continue
else
useradd $user
if [ $? -eq 0 ]; then
echo "创建" $user "成功"
fi
fi
done
a=1
while [ $a -le $n ];do
user=$m$a
let a++
echo $p | passwd --stdin $user &> /dev/null
if [ $? -eq 0 ];then
echo "用户" $user "密码修改成功"
else
echo "用户" $user "密码修改失败"
fi
done