c语言sscanf函数的用法是什么
252
2022-11-04
for循环 whil语句,循环控制语句
一 for循环语法
在实际工作中,经常会遇到某项任务需要多次执行的情况,而每次执行时仅仅是处理的 对象不一样,其他命令相同。例如,根据通讯录中的姓名列表创建系统账号,根据服务器清 单检查各主机的存活状态。当面对各种列表重复任务时,使用简单的 if 语句已经难以满足要求,而顺序编写全部代 码更是显得异常烦琐、困难重重。
一 for循环语法
1、语法结构
(1)列表循环
(2)不带列表循环
(3)类C风格的for循环
(1)列表循环
for 变量名 in {list}
do
command
done
for i in {a..c}
do
echo $i
done
for i in {1..5} //{}里面不识别变量
do
echo $i
done
例2:打印abcde
附1小技巧:花括号{}和seq在for循环的应用:
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 $(seq 0 2 10) 1-10的偶数,中间为步长
例子
for i in $(seq 0 2 10);do echo $i ;done
(2)不带列表循环执行时由用户指定参数和参数的个数决定的
for 变量名
do
command
done
例1:打印hello
第一种:
[root@server ~]# vim for2.sh
#!/bin/bash
for i
do
echo hello
done
[root@server ~]# . /a.sh //没有给脚本传参所以执行了没有结果
[root@server ~]# . /a.sh a //把a赋值给变量i,i有值了它就开始执行do..done了
hello
第二种:
for i
do
echo $i
done
[root@client ~]# bash a.sh hello
hello
(3)类C风格的for循环
for ((expr1;expr2;expr3))do commanddoneexpr1:定义变量并赋初值expr2:决定是否循环expr3:决定循环变量如何改变,决定循环什么时候退出例1:打印1-5迭代[root@server ~]# vim a.sh#!/bin/bashfor ((i=1;i<=5;i++))do echo $idone12345注:i
++ : i=1+1 先赋值再运算 i=1 之后 再 +1
++i : 1+1=i 先运算再赋值 1+1 之后 再=i
或者
例2:打印1-10的奇数[root@server ~]# vim a.sh#!/bin/bashfor ((i=1;i<=10;i+=2)) //i=i+2do echo $idone 附2:类C风格运算符用法
自身变量+1自身变量-1
+=5 自身变量+5-=5 自身变量-5*=5 自身变量*5/=5 自身变量/5%=5 自身变量%5例3:计算1-100的偶数和[root@server ~]# vim a.sh #!/bin/bashsum=0for ((i=0;i<=100;i+=2))do let sum=$i+$sumdoneecho "1-100的偶数和为:$sum"
案例:
例1、批量添加用户两种方式
1)已后缀批量变化添加
for i in {1..5}
do
useradd stu$i
echo "123" | passwd --stdin stu$i
done
或者 创建6个
2)脚本批量添加用户=====
#!/bin/bash
S=$(cat /home/a.txt)
for i in $S
do
useradd $i
echo "123456" | passwd --stdin $i
done
echo “用户创建完毕”
//批量删除用户的脚本=====
vim udelfor.sh
#!/bin/bash
ULIST=$(cat /root/users.txt)
for UNAME in $ULIST
do
userdel -r $UNAME &>/dev/null
done
例2、根据 IP 地址列表检查主机状态
-c 发送包的数量;-i 发送 ping 包间隔;-W 超时时间
1)根据文本查看
2)根据段查看
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
例3 用户输入密码,脚本判断密码是否正确,输入正确提示正确信息,连续输错3次则报警
#!/bin/bash
M=123456
for ((i=1;i<=3;i++))
do
read -p "请输入密码:" S
if [ $S == $M ];then
echo "密码正确"
exit
else
echo "已输入$i次,密码错误,请重新输入"
fi
done
echo "输入超过三次,密码已锁定"
例4 #幸运会员
#!/bin/bash
a=0
b=0
c=0
for ((i=1;i<=10;i++))
do
num=$(expr $[RANDOM%3+1])
LIST=$(cat /opt/name.txt|grep "$num"|awk -F: '{print $2}')
case $LIST in
zhangsan)
let a++
;;
lisi)
let b++
;;
*)
let c++
esac
echo "$LIST"
done
echo "zhangsan:$a次、lisi:$b次、wangwu:$c次"
二 while 循环
1、语法结
2、死循环
(1)语法结构(3种)
while循环一般用于有条件判断的循环,若判断条件为真,则进入循环,当条件为假就跳出循环
1、语法结构
while表达式
do
command
done
例1:打印1-5
[root@server ~]# vim while.sh
#!/bin/bash
i=1
while [ $i -le 5 ]
do
echo $i
let i++ //注意这里如果不改变$i的值,会变成死循环#
i=$[$i+1]//两种写法
done
例2:输出1-100之间不能被3整除的数字
例3:打印1-100的和
例4:监控某服务( while死循环
while [ 1 -eq 1 ]
//写一个永远为真的表达式,1等于1这个条件永远为真,所以这个脚本会一直循环下去
do
command
done
while true //条件为真一直运行
do
command
done
或
while :
do
command
done
例1:猜数字,猜不对就一直猜
#!/bin/bash
N=100
while true
do
read -p "请输入一个数字:" S
if [ $S -eq $N ];then
echo "恭喜你猜对了"
exit
elif [ $S -lt $N ];then
echo "你猜小了"
elif [ $S -gt $N ];then
echo "你猜大了"
fi
done
例21.批量添加规律编号的用户#!/bin/bashUSERS="stu"i=1while [ $i -le 20 ] douseradd ${USERS}$iecho "123456" | passwd --stdin ${USERS}$i &> /dev/null let i++done例3猜商品价格游戏$random用于生成0—32767的随机数第一种方法#!/bin/bashPRICE=$(expr $RANDOM % 1000)a=0echo "商品实际价格范围为 0-999,猜猜看是多少?" while truedoread -p "请输入你猜测的价格数目:" n let a++if [ $n -eq $PRICE ] ; thenecho "恭喜你答对了,实际价格是 $PRICE" echo "你总共猜测了 $a 次"exit 0elif [ $n -gt $PRICE ] ; then echo "你猜高了!"elseecho "你猜低了!"fi done第二种方法#!/bin/bashsorce=$[$RANDOM % 1000]a=1num=0while[ $a -lt 2 ]doread -p "请输入你猜的价格(1-999之 间) :" priceif [ $price -eq $sorce ] ; thenecho "恭喜你猜对了!"let num++let a++elif [ $price -gt $sorce ] ; thenecho "你猜高了!"let num++elif[ $price -lt $sorce ] ; thenecho "你猜小了!"let num++fidoneecho "你一共猜了$num次!"例4 实时监控本机内存和硬盘剩余空间,剩余内存小于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 <
版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。
发表评论
暂时没有评论,来抢沙发吧~