1、while循环
while循环是一种判断循环,通过条件表达式,判断结果是真还是假,如果是真则执行命令序列,并循环判断,如果结果为假,则结束判断。
while循环语句再使用时,一定要注意测试条件的改变,如果每次循环判断时,条件没有发生任何改变,则会变成死循环。死循环不是死机,用户可以强制结束脚本或进程。在无限循环的过程中,如果进程占用了所有的硬件资源,则有可能会导致死机。
语法:
while [ 条件表达式 ]
do
命令序列
done
例:
#!/bin/bash
a=0
while [ $a -le 5 ]
do
echo $a
let a++
done
例:使用while语句脚本,创建指定用户名前缀,指定数量的用户,并设置密码为123.com
#!/bin/bash
read -p "请输入用户名:" user1
read -p "请输入创建数量:" num1
a=1
while [ $a -le $num1 ]
do
useradd $user1$a
echo "123.com" | passwd $user1$a --stdin
let a++
done
例:使用while循环,测试主机的连通性。
#!/bin/bash
a=1
while [ $a -le 254 ]
do
ping 192.168.10.$a -c 1 -i 0.01 -w 1 &> /dev/null
if [ $? -eq 0 ];then
echo "主机 192.168.10.$a可以连通。"
else
echo "主机 192.168.10.$a不能连通。"
fi
let a++
done
例:使用while语句脚本求1到100的和
#!/bin/bash
a=0
b=0
while [ $a -le 100 ]
do
b=$(expr $b + $a)
let a++
done
echo $b
例:使用while语句,给用户输入密码,两次密码不同时,要求重新输入。
#!/bin/bash
while true
do
stty -echo
read -p "请输入密码:" pass1
printf "\n"
read -p "请再次输入密码:" pass2
printf "\n"
stty echo
if [ -z $pass1 ] || [ -z $pass2 ];then
echo "密码不能为空,请重新输入"
elif [ $pass1 = $pass2 ];then
echo "正在给用户设置密码"
echo $pass1 | passwd $1 --stdin
exit 0
else
echo "两次密码不同,请重新输入密码"
fi
done
例:猜猜看,随机生成一个1000以内的整数,猜测数值是多少?
#!/bin/bash
echo "请猜猜看商品价格是多少?"
echo
time=0
num=$(expr $RANDOM % 1000)
while true
do
let time++
read -p "请输入数值:" a
if [ $a -eq $num ];then
echo "恭喜你猜对了,价格是:$a"
echo "你总共猜了 $time 次。"
exit 0
elif [ $a -gt $num ];then
echo "价格高了"
else
echo "价格低了"
fi
done
2、case循环
case是一种选择性跳转语句,通过用户指定的变量值,匹配字符串标记,与标记相同的,则执行该标记下的命令序列,不同的,则跳过。直到esac结束。
语法:
case 变量名 in
标记1)
命令序列
;;
标记2)
命令序列
;;
标记3)
命令序列
;;
esac
case语句可以编写菜单选项或者服务管理脚本。
例:编辑一个服务管理脚本。可以使用nfs服务或httpd服务练习。
#!/bin/bash
case $1 in
start)
systemctl start nfs
;;
stop)
systemctl stop nfs
;;
restart)
$0 stop
$0 start
;;
*)
echo " 请使用 start | stop | restart 参数"
;;
esac
例:制作一个简单的游戏对话菜单
#!/bin/bash
while true
do
echo "老村长:孩子,我看你骨骼惊奇,是练武奇才,你希望做什么职业?"
echo "A 猎手"
echo "B 术士"
echo "C 机械师"
echo "D 骑士"
echo "E 召唤师"
echo "F 乞丐"
echo "Q 退出,等等再说"
read -p "请选择职业:" num
case $num in
A|a)
echo "你选择的职业为猎手,你的初始能力为...."
;;
B|b)
echo "你选择的职业为猎手,你的初始能力为...."
;;
C|c)
echo "你选择的职业为猎手,你的初始能力为...."
;;
D|d)
echo "你选择的职业为猎手,你的初始能力为...."
;;
E|e)
echo "你选择的职业为猎手,你的初始能力为...."
;;
F|f)
echo "你选择的职业为猎手,你的初始能力为...."
;;
Q|q)
exit 0
esac
read -p "你确认以上信息吗?" yy
if [ $yy = y ];then
exit 1
fi
done
例:使用while与case语句写出交互式界面菜单
菜单内容:
A 显示主机IP地址
B 显示根分区可用空间
C 显示交换分区可用空间
D 显示内存可用空间
E 显示系统时间
Q 退出系统
#!/bin/bash
while true
do
echo "------傻瓜系统维护工具-------"
echo
echo
echo "1 显示主机IP地址"
echo "2 显示根分区可用空间"
echo "3 显示交换分区可用空间"
echo "4 显示内存可用空间"
echo "5 显示系统时间"
echo "6 退出系统"
echo
echo
read -p "请输入选项:" num
case $num in
1)
ifconfig ens33 |grep "inet " | awk '{print $2}'
;;
2)
df | grep "/$" |awk '{print $4}'
;;
3)
free |grep "Swap" |awk '{print $4}'
;;
4)
free |grep "Mem" |awk '{print $4}'
;;
5)
date
;;
6)
exit 0
esac
done
例:利用while循环在屏幕上显示一个5x5的*
#!/bin/bash
a=1
while [ $a -le 5 ]
do
b=1
while [ $b -le 5 ]
do
echo -n "*"
let b++
done
echo
let a++
done
例:使用循环语句在屏幕上用*号组成的,显示指定行数的菱形
#!/bin/bash
read -p "请输入*号的行数:" long
for((i=1;i<=$long;i++)) #图形上半部分
do
for((j=$long;j>i;j--))
do
echo -n " "
done
for m in `seq 1 $i`
do
echo -n "*"
done
#for((n=1;n for n in `seq 2 $i`
do
echo -n "*"
done
echo ""
done
for((i=2;i<=$long;i++)) #图形下半部分
do
for ((j=1;j do
echo -n " "
done
let k=$long+1-$i
for m in `seq 1 $k`
do
echo -n "*"
done
for ((n=1;n
do
echo -n "*"
done
echo ""
done
练习:
1、使用while语句,给指定的用户输入密码,两次密码不同时,要求重新输入,并且判断密码不能为空,如果为空,也要求重新输入。
2、使用while与case语句写出交互式界面菜单
菜单内容:
1 配置网卡IP地址
2 设置共享目录
3 查看指定服务的工作状态
4 测试指定主机的通讯状态
5 给本地主机添加交换分区容量
q 退出
3、使用while语句编写99乘法表