2023年8月2日发(作者:)
Shell脚本之for循环、while循环,if语句、case语句1. for循环⼀般格式:格式1: for((条件)) do
动作 done格式2: for 变量名 in 范围 do
动作 done实验:##1. 输出数字:1-5[root@localhost ~]# vim ####################!/bin/bashfor NUM in {1..5}do echo $NUMdone[root@localhost ~]# sh
12345##2.将输出数字:1-6 并且 间隔为2[root@localhost ~]# vim ####################!/bin/bashfor NUM in `seq 1 2 6` ## 2表⽰步长do echo $NUMdone[root@localhost ~]# sh
135⽰例1:检测所有1-60的ip⽹络通信状态[root@localhost mnt]# vim ip_
######################!/bin/bashfor((i=1;i<=60;i++))do ping -c1 -w1 172.25.254.$i > /dev/null && echo 172.25.254.$i is UP || echo 172.25.254.$i is DOWN sleep 1done注释: > /dev/null ##将冗余的输出信息导⼊到垃圾箱中sleep 1 ##每秒刷新⼀次&& ##表⽰若能与主机能进⾏通信则输出....UP|| ##表⽰若不能与主机进⾏通信则输出....DOWN[root@localhost mnt]# sh ip_⽰例2:10s倒计时[root@localhost mnt]# vim
######################!/bin/bashfor((i=10;i>0;i--))do echo -n " After $i's is end " echo -ne "r"
sleep 1done注释: r ##表⽰回车:覆盖之前的输出(注意:必须加-e解析)sleep 1 ##表⽰每秒刷新1次[root@localhost mnt]# sh
练习1:⽤户以 分:秒 格式输⼊时间 进⾏倒计时编写脚本:[root@localhost mnt]# vim time_
######################!/bin/bashread -p 'please input minute:' a ##⽤变量a来接收⽤户输⼊的分钟read -p 'please input second:' b ##⽤变量b来接收⽤户输⼊的秒钟[ "$b" -gt 60 ]&&{ ##判断输⼊的秒钟是否符合实际,⼀般秒位不超过为60即为⼀分钟(其实不做判断也可以的) echo "EROOR: please input a correct second!" exit 1}c=$[$a*60+$b] ##将分钟和秒都化为以秒为单位;转换关系:⼀分钟等于60秒for((;c>=0;c--))do m=$[$c/60] ##计算新的分钟 s=$[$c%60] ##计算新的秒钟 echo -n "Time is $m:$s " echo -ne "r" ##覆盖前⼀秒的输出信息 sleep 1 ##每秒刷新⼀次done执⾏脚本:[root@localhost mnt]# sh time_
[root@localhost mnt]# sh time_
2. while循环⼀般格式:
while 条件do ##满⾜条件则执⾏动作 动作done实验:[root@localhost ~]# vim ###################while true ## 死循环,若没有外界条件的⼲扰,则会⼀直循环不停⽌do echo -n `uptime` echo -ne "r" ## -e表⽰解析 ,-r表⽰回车,即覆盖上⼀秒的输出信息 sleep 1 ## 每秒刷新⼀次done[root@localhost ~]# sh ^C:37:17 up 58 min, 3 users, load average: 0.14, 0.05, 0.06⽰例3:批量创建⽤户并给其设定密码为123##⾮交互式设定⽤户密码[root@localhost mnt]# echo "123" | passwd student --stdin[root@localhost mnt]# ls /homestudent[root@localhost mnt]# sh
######################!/bin/bashUSERNAME="westos"i=1while [ $i -le 10 ] ##当满⾜表达式时则执⾏do中的命令do useradd ${USERNAME}$i ##创建⽤户 echo "123" | passwd ${USERNAME}$i --stdin &> /dev/null ##⾮交互式设定⽤户密码 ((i++))done[root@localhost mnt]# sh
测试:##检验⽤户是否创建成功[root@localhost mnt]# ls /home/student westos10 westos3 westos5 westos7 westos9westos1 westos2 westos4 westos6 westos8##检验密码是否设定成功[root@localhost mnt]# su - westos1[westos1@localhost ~]$ su - westos2Password:
[westos2@localhost ~]$ exitlogout[westos1@localhost ~]$ exitlogout3.嵌套循环1. for循环的嵌套for((条件))do for((条件)) do 动作 循环的嵌套while 条件do while 条件 do 动作 donedone⽰例4:打印乘法⼝诀表分析:乘法⼝诀表有9⾏9列,并且当前的⾏数等于当前的列数,即第1⾏有1个等式,第2⾏有2个等式;显⽰需要⽤到嵌套循环⽅法1:[root@localhost mnt]# vim 9*#####################for((i=1;i<=9;i++))do for((j=1;j<=i;j++)) do echo -n "$i*$j=$[$i*$j] " done echo -e "n" ##n表⽰换⾏;注意:必须加-e解析done[root@localhost mnt]# sh 9* ⽅法2:[root@localhost mnt]# vim 9*####################for((i=1;i<=9;i++))do for((j=1;j<=i;j++)) do echo -ne "$i*$j=$[$i*$j]t" ##-t表⽰4个空格 if ##注意:if语句中的条件必须有空格才能⽣效 [ $i = $j ] then echo -e "n"
fi donedone[root@localhost mnt]# sh 9* 4. if语句if语句的⼀般形式:(1).单个条件if 条件
then 执⾏命令fi
if 条件1then 执⾏命令1else 执⾏命令2fi(2).多个条件if 条件1then 执⾏命令1elif 条件2then 执⾏命令2.....else 执⾏命令3fi⼏种常见的退出⽅式:
exit ##退出当前脚本 break ##退出当前循环 continue ##提前退出当前循环,进⼊下⼀次循环注意:eq不能⽤于⽐较字符串,⽐较字符串只能⽤ ==实验:[root@localhost ~]# vim ####################!/bin/bashfor NUM in {1..5}do if [ "$NUM" -eq 3 ] then $1 ## $1表⽰脚本后跟的第⼀串字符 fi echo $NUMdoneecho hello linux![root@localhost ~]# sh 12345hello linux![root@localhost ~]# sh exit12[root@localhost ~]# sh break12hello linux!5. case语句⼀般⽤于多个条件的判断(1) case语句的⼀般格式 case 变量名 in 常量1) ##可以⽤于判断多个条件;当常量1与变量名相同时,执⾏命令1,以此类推 命令1 ;; 常量2)
命令2 esac(2) if语句与case语句的区别 if语句中的条件判断是从上到下顺序依次判断
case语句中的条件判断是同步的实验:[root@localhost ~]# vim ###################case $1 in ## 脚本后跟的第⼀串字符为dog时输出cat,为cat时输出dog,为其他时输出ERROR报错信息 dog) echo cat ;; cat) echo dog ;; *) echo ERROR: Please input cat or dog
esac[root@localhost ~]# sh
ERROR: Please input cat or dog
[root@localhost ~]# sh catdog[root@localhost ~]# sh dogcat⽰例5:⽤户输⼊以下⼏个选项,实现相应的功能:A 显⽰主机ipB 显⽰磁盘剩余空间C 显⽰系统运⾏时间D 退出系统分析:##只输出ip[root@localhost mnt]# ifconfig eth0 | grep "inet " | awk '{print $2}'172.25.254.166##第⼀⾏的Availabe表⽰磁盘剩余空间[root@localhost mnt]# df [root@localhost mnt]# df | awk 'NR==2' | awk '{print "磁盘剩余空间为:" $2}'[root@localhost mnt]# uptime | awk '{print $3}' | awk -F, '{print $1}' | awk -F: '{print "系统已经运⾏:" $1 "⼩时" $2 "分钟"}'编写脚本:[root@localhost mnt]# vim #####################echo -e "033[35m A 显⽰主机IP 033[0m " ##显⽰菜单echo -e "033[32m B 显⽰磁盘剩余空间 033[0m "echo -e "033[33m C 显⽰系统运⾏时间033[0m "echo -e "033[31m Q 退出系统 033[0m "while true ## ⽆限循环do read -p "please input a cheracter (A/B/C/Q): " i case $i in A|a) echo -e "033[35m ` ifconfig eth0 | grep "inet " | awk '{print $2}' ` 033[0m " ;; B|b) echo -e "033[32m `df | awk 'NR==2' | awk '{print "磁盘剩余空间为:" $2}' ` 033[0m " ;; C|c) echo -e "033[33m ` uptime | awk '{print $3}' | awk -F, '{print $1}' | awk -F: '{print "系统已经运⾏:" $1 "⼩时" $2 "分钟"}' ` 033[0m " ;; Q|q) echo -e "033[34m good bye ~ 033[0m " exit 1 ;; *) echo -e "033[31m ERORR: Please input a correct character 033[0m " esacdone注释:033[35m 033[0m ##35表⽰颜⾊ 0m表⽰关闭属性;注意:必须加-e解析才能识别颜⾊while true ##表⽰这是⼀个⽆限循环;即为死循环case ##case语句⽤于多个条件执⾏脚本:[root@localhost mnt]# sh
发布者:admin,转转请注明出处:http://www.yc00.com/web/1690919082a463458.html
评论列表(0条)