前言在Linux中,Bash脚本是非常基础的知识,听到脚本你可能会觉得很高级,就像小编刚开始学习的时候,感觉自己可以写剧本都是大神。复杂的脚本虽然很费脑子,但是当我们熟练掌握它们的用法和技巧,多加练习,总有一天我们会成为得心应手的脚本高手。脚本在制作中的作用,想必小编就不说了,大家都知道脚本写6,可以省去很多繁琐的操作,减轻你的工作压力。好了,废话不多说,接下来就是展示Bash脚本的用法了。1、条件选择、判断1、条件选择if(1)if判断条件1的使用格式;then 条件为真分支代码elif判断条件2;then 条件为真分支代码elif判断条件3;then 条件为真分支代码else 以上所有条件均为假的分支代码fi是逐个条件判断的,当第一次遇到“真”条件时,执行它的分支,然后结束整个if。(2)经典案例:①确定年龄#!/bin/bashread-p"Pleaseinputyourage:"ageif[[$age=~[^0-9]]];echo"pleaseinputaint"exit10elif[$age-ge150];thenecho"yourageiswrong"exit20elif[$age-gt18];thenecho"goodgoodwork,daydayup"elseecho"好好学习,daydayup"fi分析:请输入年龄,先判断输入是否包含数字以外的字符,如果是则报错;如果不是,继续判断是小于150还是大于18。②判断分数#!/bin/bashread-p"请输入你的分数:"scoreif[[$score=~[^0-9]]];thenecho"pleaseinputaint"exit10elif[$score-gt100];thenecho"Yourscoreiswrong"exit20elif[$score-ge85];thenecho"Yourscoreisverygood"elif[$score-ge60];thenecho"Yourscoreissoso"elseecho"Youareloser"fi分析:请输入分数,首先判断输入的是否包含数字以外的字符,如果是则报错;如果不是,则继续判断是否大于100,是否大于85,是否大于60。2.条件判断案例(1)用法格式案例$namein;PART1) cmd;;PART2) cmd;;*) cmd;;esac注意:大小写支持通配符形式: *:任意长度,任意字符 ?:任意单个字符 []:指定范围内的任意单个字符 a|b:aorb(2)case:判断yesorno#!/bin/bashread-p"Pleaseinputyesorno:"anwcase$anwin[yY][eE][sS]|[yY])echoyes;;[nN][oO]|[nN])echono;;*)echofalse;;esac分析:请输入yes或no,回答Y/y,yes全部大小写组合为yes;answerN/n,No所有大小写组合都是no。2.四次循环1.for(1)使用格式①fornameinlist;do 循环体done②for((exp1;exp2;exp3));do cmddoneexp1只执行一次,相当于嵌入whileinfor③执行机制:将列表中的元素依次赋值给“变量名”;每次赋值后执行一次循环体;直到列表中的元素都用完,循环结束列表表示方法可以是glob通配符,如{1..10},*.sh;也可以使用变量引用,如:seq1$name(2)案例①找出(1+2+...+n)sumsum=0read-p"请输入一个正整数:"numif[[$num=~[^0-9]]];然后echo"inputerror"elif[[$num-eq0]];然后echo"inputerror"elseforiin`seq1$num`;dosum=$[$sum+$i]doneecho$sumfiunsetzhi分析:sum初值为0,请输入一个数,先判断输入是否包含除数,如果有其他字符,会报错;如果不判断是否为0,不为0则进入for循环,i的范围为1~输入的数,每次循环sum=sum+i,循环结束,最后输出sum值.②求(1+2+...+100)for((i=1,num=0;i<=100;i++));do[$[i%2]-eq1]&&letsum+=idoneechosum=$sum分析:i=1,num=0;当i<=100时,进入循环,若i÷2余数=1,则sum=sum+i,i=i+1。2.while(1)while循环控制条件的使用格式;do loopdone循环控制条件;进入循环前,先做判断;每次循环后,再做一次判断;如果条件为“真”,则执行循环;直到条件测试状态为“false”,循环终止(2)特殊用法(遍历文件的每一行):whilereadline;控制变量初始化 循环体完成/dev/null;dosleep0.5donepkill-9-uxiaoming分析:每0.5秒扫描一次,直到找到xiaoming用户login,kill这个进程,即退出脚本,用于监控用户登录。4.选择循环和菜单(1)用法selectvariableinlistdo 循环体命令done①select循环主要用于创建菜单,按数字顺序排列的菜单项会显示在标准错误上,同时显示PS3提示符,等待用户输入命令③用户输入存储在内置-invariableREPLY④select是一个死循环,所以记得用break命令退出循环,或者用exit命令终止脚本。也可以按ctrl+c退出循环⑤select,常与case结合使用⑥类似for循环,可以省略inlist,此时使用position参数(2)case:生成菜单并显示所选价格PS3="请选择菜单:"选择菜单在米饭汇面饺子八宝洲退出case$REPLYin1|4)echo"价格为15";;2|3)echo"价格是20";;5)打破;;*)echo分析“notheoption”esacdone:PS3是select的提示,自动生成菜单,选择5break退出循环。三、循环中的一些用法1、循环控制语句(1)语法continue[N]:提前结束第N层当前循环,直接进入下一轮判断;theinnermostlayerisfirstlayerbreak[N]:提前结束N层循环,最内层为第一层例子:whileCONDTITON1;do CMD1ifCONDITION2;然后 继续/breakfi CMD2done(2)case:①求和(1+3+...+49+53+...+100)#!/bin/bashsum=0foriin{1..100};do[$i-eq51]&&continue[$[$i%2]-eq1]&&{letsum+=i;leti++;}doneechosum=$sum分析:做1+2+...+100个循环,当i=51时,跳过本次循环,但继续整个循环,结果为:sum=2449②求和(1+3+...+49)#!/bin/bashsum=0foriin{1..100};do[$i-eq51]&&break[$[$i%2]-eq1]&&{let总和+=我;设我++;}doneechosum=$sum分析:做1+2+...+100个循环,当i=51时,跳出整个循环,结果为:sum=6252,循环控制shift命令(1)用到将参数列表左移指定次数,最左边的参数从列表中删除,后面的参数继续进入循环(2)案例:①创建多个指定用户#!/binbashif[$#-eq0];thenecho"Pleaseinputaarg(eg:`basename$0`arg1)"exit1elsewhile[-n"$1"];douseradd$1&>/dev/nullshiftdonefi分析:如果有没有输入参数(参数总数为0),会提示错误并退出;否则进入循环;如果第一个参数不是空字符,创建一个以第一个参数命名的用户,去掉第一个参数,将后面的参数作为第一个参数向左移动,直到没有第一个参数,然后退出。②打印一个直角三角形的字符#!/binbashwhile(($#>0))doecho"$*"shiftdone3,返回值结果为真,一直返回成功结果:nullcommand,什么也不做,返回成功的结果false,总是返回错误的结果创建一个无限循环whiletrue;doloopbodydone4,循环可以并行执行,让脚本运行得更快(1)name的用法在列表中;做{ 循环体}&donewait(2)例子:在指定ip(子网掩码为24)的网段中查找UP的ip地址read-p"Pleaseinputnetwork(eg:192.168.0.0):"netecho$net|egrep-o"<(([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])){3}([0-9]|[1-9][0-9]|1[0-9]{2}|2[0-4][0-9]|25[0-5])>"[$?-eq0]||(echo"inputerror";exit10)IP=`echo$net|egrep-o"^([0-9]{1,3}.){3}"`foriin{1..254};do{ping-c1-w1$IP$i&>/dev/null&&echo"$IP$iisup"}&donewait分析:如果格式不是0.0,请输入IP地址如192.168.37.234.0.0,会报错退出;如果正确则进入循环,此时IP变量的值为192.168.37。i的范围是1-254,并行ping192.168.37.1-154,如果能ping通,说明这个IP的输出是UP。直到循环结束。4.信号捕获trap1,使用格式trap'触发指令'signal,自定义进程收到系统指定信号后,执行触发指令代替原来的操作trap''signal,忽略信号操作trap'-'signal,恢复原信号的操作trap-p,列出自定义信号操作signal可以用3种方式表示:信号编号2,全称SIGINT,缩写INT2,普通信号1)SIGHUP:让它重新读取而不关闭进程配置文件2)SIGINT:终止正在运行的进程;相当于Ctrl+c3)SIGQUIT:相当于ctrl+9)SIGKILL:强行杀死正在运行的进程15)SIGTERM:终止正在运行的进程(默认15)18)SIGCONT:继续运行19)SIGSTOP:后台休眠9signals,强行杀,抓不到3、case①打印0-9,ctrl+c无法终止#!/bin/bashtrap'echopressctrl+c'2for((i=0;i<10;i++));dosleep1echo$idone分析:i=0,当i<10时,每次sleep1秒,i+1,捕获2个信号,执行echopressctrl+c②print0-3,ctrl+c无法终止,resume3之后,可以终止#!/bin/bashtrap''2trap-pfor((i=0;i<3;i++));dosleep1echo$idonetrap'-'SIGINTfor((i=3;i<10;i++));dosleep1echo$idone分析:i=0,当i<3时,每sleep1秒,i+1,捕获2信号;当i>3时,释放捕获2信号。五。脚本知识(持续更新中)1.生成随机字符cat/dev/urandom生成8个随机大小写字母或数字cat/dev/urandom|tr-dc[:alnum:]|head-c82.生成随机数echo$随机 确定范围echo$[RANDOM%7]7个随机数(0-6) echo$[$[RANDOM%7]+31]7个随机数(31-37)3.echo打印颜色字echo-e"033[31malong033[0m"显示红色alongecho-e"033[1;31malong033[0m"高亮红色alongecho-e"033[41malong033[0m"显示红色alongecho-e"033[31;5malong033[0m"显示红色闪烁alongcolor=$[$[RANDOM%7]+31]echo-ne"033[1;${color};5m*033[0m"沿显示随机颜色闪烁6.分享几个有趣的小脚本1.9x9乘法table#!/bin/bashforain{1..9};doforbin`seq1$a`;doletc=$a*$b;echo-e"${a}x${b}=$ctc"doneechodone2,coloredisoscelestriangle#!/bin/bashread-p"Pleaseinputanum:"numif[[$num=~[^0-9]]];thenecho"inputerror"elseforiin`seq1$num`;doxing=$[2*$i-1]forjin`seq1$[$num-$i]`;doecho-ne""doneforkin`seq1$xing`;docolor=$[$[RANDOM%7]+31]echo-ne"033[1;${color};5m*033[0m"完成echodonefi3.Chessboard#!/bin/bashred="033[1;41m033[0m"yellow="033[1;43m033[0m"foriin{1..8};doif[$[i%2]-eq0];然后foriin{1..4};doecho-e-n"$red$yellow";doneechoelseforiin{1..4};doecho-e-n"$yellow$red";doneechofidone好了,今天的内容就这些了,其实小编的脚本编写水平也是新手级别的,大家一起努力成为脚本编写高手吧!!!来源:https://www.cnblogs.com/沿...
