700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > Shell版本循环语句(if//for/while/case)

Shell版本循环语句(if//for/while/case)

时间:2020-07-25 13:23:49

相关推荐

Shell版本循环语句(if//for/while/case)

if选择结构

if单分支处理:当“条件成立”时执行命令序列xx,否则,不执行任何操作(只判断为真)

if[条件测试];then

命令序列xx

fi

示例:检测/media/cdrom目录,若不存在则创建

#!/bin/bashMOUNT_DIR="/media/cdrom/"if[!-d$MOUNT_DIR];thenmkdir-p$MOUNT_DIRfi

示例:每分钟判断当前登陆用户是否超过3人,若超过3人,自动发送邮件给root,报警!

#!/bin/bashnum=$(who|wc-l) #计算登陆用户if[$num-gt3];then #判断用户是否大于3,如果大于,则发送邮件mail-sWarningabc@</root/mail.txtmail-sWarningroot</root/mail.txtfi

1、chmod+xtest.sh

2、将脚本放到计划任务内:crontab-e

*****/root/test.sh

示例:如果是管理员,执行所有命令

#!/bin/bashif[$USER==root];thenyum-yinstallvsftpdsystemctlstartvsftpdsystemctlenablevsftpd`fi

###############################################################################

if双分支处理:当“条件成立”时执行命令序列xx,否则,执行命令序列yy(非对即错)

if[条件测试];then

命令序列xx

else

命令序列yy

fi

示例:检测并判断指定的主机是否可ping通。用户输入IP地址,判断是否能ping通。能则输出ip地址up;不能则输出ip地址down。

为了节省ping测试时间,可以只发送3个测试包(-c3)、缩短发送测试包的间隔秒数(-i0.2)、等待反馈的超时秒数(-W3)。

#!/bin/bashread-p'请输入您要测试的IP地址:'ipping-c2-i0.1-W2$ip&>/dev/nullif[$?-eq0];thenecho"Host$ipisup."elseecho"Host$ipisdown."fi

#chmod+xpinghost.sh

#./pinghost.sh192.168.4.5

示例:判断用户输入的用户名,该用户是否存在,存在则输出用户id基本信息,不存在则创建此用户

#!/bin/bashread-p'请输入您的用户名:'userid$user&>/dev/null或使用useradd$userif[$?-eq0];thenecho用户已经创建elseecho用户已存在id$userfi

if多分支处理:当条件1满足时,作xx处理;否则继续检查

条件2,若成立则作yy处理;否则,作zz处理

相当于多层if语句嵌套,针对多个条件分别执行不同的操作

if[条件测试1];then

命令序列xx

elif条件测试2;then

命令序列yy

....

else

命令序列zz

fi

脚本的退出状态:取决于退出前最后一条命令的$?值,或者“exit整数值”指定。

示例:猜数字游戏:

#!/bin/bashnum=$[RANDOM%100]foriin{1..10}doread-p"请输入一个范围在「0-99」的数字:"guessif[$num-eq$guess];thenecho"你猜对了,恭喜您!!!"echo"随机数为:$num;您猜的数字为:$guess"echo"恭喜,猜对了,猜了$i次"exitelif[$num-lt$guess];thenecho"您猜错了,您输入的数字比随机数大,您猜了$i次"echo"您猜的数字为:$guess"elseecho"您猜错了,您输入的数字比随机数小,您猜了$i次"echo"您猜的数字为:$guess"fidone

示例:从键盘读取一个论坛积分,判断论坛用户等级

大于等于90神功绝世

大于等于80,小于90登峰造极

大于等于70,小于80炉火纯青

大于等于60,小于70略有小成

大于60初学乍练

#!/bin/bashread-p"请输入积分(0-100):"JFif[$JF–ge90];thenecho"$JF分,神功绝世"elif[$JF–ge80];thenecho"$JF分,登峰造极"elif[$JF–ge70];thenecho"$JF分,炉火纯青"elif[$JF–ge60];thenecho"$JF分,略有小成"elseecho"$JF分,初学乍练"fi

#chmod+xgradediv.sh

#./gradediv.sh

示例:输入一个分数,判断成绩分档:85-100优秀、70-84良好、低于70分不合格

#!/bin/bashread-p'请输入您的分数(0-100):'FSif[$FS-ge85]&&[$FS-le100];thenecho“$FS分!优秀”elif[$FS-ge70]&&[$FS-le84];thenecho“$FS分!合格”elseecho“$FS分!不合格”fi

示例:当运行/root/foo.shredhat,输出为fedora;当运行/root/foo.shfedora,输出为redhat;当没有任何参数或者参数不是redhat或者fedora时,其错误输出产生以下信息:/root/foo.shredhat|fedora

1)编写脚本代码#vim/root/foo.sh

#!/bin/bashif["$1"=="redhat"]thenecho"fedora"elif["$1"=="fedora"]thenecho"redhat"elseecho"/root/foo.shredhat|fedora">&2fi

另一种写法:

if[$#==0];thenecho'/root/foo.shredhat|fedora'>&2#为了对错误输出进行收集,可通过2>file查看elif[$1==redhat];thenechofedoraelif[$1==fedora];thenechoredhatelseecho'/root/foo.shredhat|fedora'>&2fi

2)添加x执行权限#chmod+x/root/foo.sh

3)测试提供正确参数的情况#/root/foo.shredhat

测试提供非预期参数的情况#/root/foo.shubuntu

测试不提供参数的情况 #/root/foo.sh

###############################################################################

列表式循环——给定一批对象,反复执行类似的操作(如购票者==>售票)

for循环处理

遍历/列表式循环:根据变量的不同取值,重复执行xx处理

列表式for循环结构:

for变量名in值1值2值3....(变量名一般习惯用i)

do

命令序列($变量名)

done

示例:造数1:touch{1..10000}.txt

#!/bin/bashforiin`seq10000`dotouch/tmp/$i.txtdone

示例:造数2:touch{01..10}.txt

#!/bin/bashforiin{1..10}douseraddstu$iecho123456|passwd--stdinstu$i&>/dev/nullechostu$i创建成功idtest$adone

示例:编写一个批量添加用户脚本,此脚本要求提供用户名列表文件作为参数,列表测试文件:http://classroom/pub/materials/userlist。如果没有提供参数,此脚本应该给出提示Usage:/root/batchusers,退出并返回相应值;如果提供一个不存在的文件,此脚本应该给出提示Inputfilenotfound,退出并返回相应值

1)编写脚本代码#vim/root/batchusers

#!/bin/bashif[$#-eq0];then #判断位置变量为0个echo‘Usage:/root/batchusers’>&2#将正确信息变成错误信息exit1#退出返回值为1fiif[!-f$1];then #文本不存在为真echo‘Inputfilenotfound’>&2#将正确信息变成错误信息exit2#退出返回值为2fifornamein$(cat$1)# $1为文件,cat$1可以显示为文本参数,$()传递参数douseradd-s/bin/false$namedone

2)添加x执行权限#chmod+x/root/batchusers

3)测试batchusers批量添加用户脚本

下载用户列表测试文件:

#wgethttp://classroom/pub/materials/userlist-O/root/userlist

#cat/root/userlist//检查下载文件

实现批量添加用户:#/root/batchusers/root/userlist

#idduanwu

测试其他异常处理:

#/root/batchusers//未提供列表文件,Usage:/root/batchusers<userfile>#echo$?//返回1

#/root/batchusers/root/userlist.txt//提供的列表文件找不到,Inputfilenotfound

#echo$?//返回2

###############################################################################

作业:

根据输入成绩的分数输出不同的提示信息

把指定的文件备份到指定的目录下

判断用户从键盘输入的数据是偶数还是奇数?

计算用户输入1-10之间的任意一个数的平方值,不输入数字的时候给出错误提示信息。

###############################################################################

循环结构

在Shell脚本应用中,常见的for循环采用遍历式、列表式的执行流程,通过指定变量从值列表中循环赋值,每次复制后执行固定的一组操作。

for循环的语法(格式1)

for变量名in值列表

do

命令序列

done

示例:批量添加用户帐号(名称没有规律)

素材:/root/users.txt

#!/bin/bashULIST=$(cat/root/users.txt)forUNAMEin$ULISTdouseradd$UNAME2>/var/err/logecho"123456"|passwd--stdin$UNAME>/dev/nulldone#chmod+xuaddfor.sh#./uaddfor.sh

示例:使用循环ping测试网络中所有主机

#!/bin/bashnet=192.168.4.foriin`seq1254`#反引号//{1..254}doping-c3-i0.2-w0.2$net$i&>/dev/nullif[$?-eq0];thenecho"该主机$net$i,ping通"elseecho"该主机$net$i,无法ping通"fidone

C语言风格的for循环(格式2)

通过变量控制,条件成立时循环;步长可控次数

for((初值;条件;步长控制))

do

命令序列

done

#!/bin/bashfor((i=1;i<=5;i+=2))//或for((i=1;i<=5;i++))doecho$idone

示例:制作9*9乘法表

#!/bin/bashfor((i=1;i<=9;i++))dofor((j=1;j<=$i;j++))doecho-n"$i*$j=$((i*j))"doneechodone

++++++++++++++++++++++++

字体色:echo-e"\033[34mOK\033[0m"

背景色:echo-e"\033[44mOK\033[0m"

for第一个人in张三李四王五....

do

为第一个人采血

done

for第一个人in$(cat用户列表文件)

do

为第一个人采血

done

for第一个人in$(cat$1)

do

为第一个人采血

done

forNAMEin$(cat$1)

do

useradd-s/bin/false$NAME

done

while循环格式

——条件式循环:反复测试条件,只要成立就执行命令序列

while循环属于条件式的执行流程,会反复判断指定的测试条件,只要条件成立即执行固定的一组操作,直到条件变化为不成立为止。所以while循环的条件一般通过变量来进行控制,在循环体内对变量值做相应改变,以便在适当的时候退出,避免陷入死循环。

while条件测试

do

命令序列

done

for循环的循环次数根据值列表而固定,而while循环的循环次数不固定

+++++++++++++++++++++++++++++++++

示例:批量添加用户(名称有规律)

#!/bin/bashPREFIX=”stu”;i=1#定义用户名前缀while[$i-le20]douseradd${PREFIX}$i#添加的用户名为:前缀+编号echo“123456”|passwd--stdin${PREFIX}$i&>/dev/nullleti++ #递增控制,避免死循环done

#chmod+xuaddwhile.sh

#./uaddwhile.sh

#grep^stu/etc/passwd#检查添加的用户

批量删除用户账号udelwhile.sh

将上一示例的命令改为

userdel-r${PREFIX}$i&>/dev/null

leti++

#grep^stu/etc/passwd//再检查已无相应账号信息

示例:检测192.168.4.0/24网段,列出不在线的主机地址

#!/bin/bashNET="192.168.4.";i=1while[$i-le254]doIP="${NET}$i"ping-c3-i0.2-W1$IP&>/dev/nullif[$?-eq0];thenecho"Host$IPisup."elseecho"Host$IPisdown."fileti++done

示例:猜数字

#!/bin/bash#这是一个猜数字的游戏biggest=10#(代表取数据的最大值)guess=0#(玩家输入的数字)guesses=0#(输入数字的次数)number=$(($$%$biggest))#randomnumber,between1and$biggest,$$代表当前脚本执行的PID,可以当作以一个随机数while[$guess-ne$number]doecho-n"Guess?";readguessif[$guess-lt$number];thenecho"...猜小了!"elif[$guess-gt$number];thenecho"...猜大了!"figuesses=$(($guesses+1))doneecho"猜对了!!!Guessed$numberin$guessesguesses."exit0#echo-n回避换行#guess=0,定义一个变量,这里存在bug,如果guess取值为0,会出错

+++++++++++++++++++++++++++++

死循环

while: whileTrue

dodo

命令命令

donedone

+++++++++++++++++++++++++++++

示例:猜数字

#!/bin/bashnum=$[RANDOM%100+1];i=0while:doread-p"请输入一个数字,范围为[1-100]:"guessleti++if[$guess-eq$num];thenecho“蒙对了,猜了$i次”exitelif[$guess-gt$num];thenecho“蒙大了”elseecho“蒙小了”fidone

示例:点名器,屏幕随机刷人名(1-n行数)

#!/bin/bashuser=/root/users.txtwhile:doclearline=`cat$user|wc-l`num=$[RANDOM%$line+1]head-$num$user|tail-1sleep0.2#加上sleep0.2,这样会使cpu的使用不致过高done

示例:写个脚本,屏幕提示如下

1.查看IP;2.查看内存;3.查看CPU信息;4.查看硬盘;5.退出

请输入您的选项[1-5]:abc

#!/bin/bashwhile:doclearecho-e"\033[34m菜单\033[0m"echo"1.查看IP2.查看CPU3.查看磁盘4.查看内存5.退出"read-p"请输入选项[1-5]:"iif[$i-eq1];thenifconfigeth0|grep"inet"read-p"按回车键继续..."elif[$i-eq2];thencat/proc/cpuinfo|grepvendorcat/proc/cpuinfo|grepMHcat/proc/cpuinfo|grepcacheread-p"按回车键继续..."elif[$i-eq3];thendf-hread-p"按回车键继续..."elif[$i-eq4];thenfreeread-p"按回车键继续..."elif[$i-eq5];thenexitelseread-p"请输入选项[1-5]:"ifidone

case语句(简化版if)

——检查变量的实际取值相匹配,则执行对应的操作

case分支属于匹配执行的方式,它针对指定的变量预先设置一个可能的取值,判断该变量的实际取值是否与预设的某一个值相匹配,如果匹配上了,就执行相应的一组操作,如果没有任何值能够匹配,就执行预先设置的默认操作。

case变量值in

模式1)

命令序列1;;

模式2)

命令序列2;;

*)

默认命令序列

esac

示例:当用户输入参数redhat(fefora),则返回fefora(redaht),其他则提示用法

#!/bin/bashif[$1=="redhat"];then# $1为脚本执行时的第一个参数echo"fedora"elif[$1=="fedora"];thenecho"redhat"elseecho"用法:$0{redhat|fedora}"fi

或者

#!/bin/bashcase$1inredhat)echo"fedora";;fedora)echo"redhat";;*)#默认输出脚本用法echo"用法:$0{redhat|fedora}"esac

示例:判断用户输入的是数字、字母、标点符号(击键类型)

#!/bin/bashread-p"输入字符:"keycase$keyin[0-9])echo数字;;[a-Z])echo"字母";;*)echo"空格、功能键或其他控制字符"esac

++++++++++++++++++++++++++++

编写Apache启动脚本:

#yum-yinstallhttpd

#vimtest.sh

#!/bin/bash#给Apache启动脚本添加开机启动功能#chkconfig:-8890#chkconfig--addmyhttpd#chkconfig--listmyhttpd#chkconfigmyhttpdon#chkconfigmyhttpdoffcase$1instart)/usr/sbin/httpdecho"我已经启动了";;stop)kill`cat/var/run/httpd/httpd.pid`;;#反引号restart)kill`cat/var/run/httpd/httpd.pid`sleep1/usr/sbin/httpd;;status)if[-f/var/run/httpd/httpd.pid];thenecho"httpdis在运行..."elseecho"没有running"fi;;*)echo"用法是$0{start|stop|restart|status}"esac

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。