|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
如果您觉得本篇CentOSLinux教程讲得好,请记得点击右边漂浮的分享程序,把好文章分享给你的好朋友们!shell剧本编程之选择把持布局
步伐开辟言语,分为两种,一种是注释型言语,一种是编译型言语。注释型言语是注释语句,而且能依据流程把持机制让语句按需实行,注释一条语句就前往语句的了局,这类言语必要一个注释器,而linux中的bash就是如许的一个注释器,罕见的注释型言语有perl,python,ruby,bash。编译型言语,起首必要编译源步伐,而且可以将源步伐转换为二进制格局,尔后让其实行,这类言语必要一个编纂器,如linux下的gcc就是一个编纂器,编译型言语有C,C++,C#等。不管是注释型言语仍是编译型言语,都有言语把持布局,没有把持布局的步伐,不克不及举动当作一个好的步伐。
言语把持布局分为三种:
按次实行:默许法例,逐条实行各语句
选择实行:前提判别,只要局部是切合前提的,只实行切合前提的局部
轮回实行:将统一段代码重复的实行n次
这篇博客写关于选择把持布局。
linux的选择把持布局有两种一种是if-then,一种是case--esac。
1、if-then
bash前提测试:
[expression]
[[expression]]
testexpression
bash下令
if-then有三种布局情势:
单分支if语句
if[前提];then
语句...
fi
这类单分支的语句,当前提满意的时分,就会运转then前面的语句,不满意就间接加入判别语句
eg:体系中是不是存在mysql用户,存在就显现mysqlexist.
1
2
3
4
5
#!/bin/bash
#thisshelltestmysqluserexistsystem.
ifidmysql;then
echo"mysqlexist."
fi
双分支if语句
if[前提];then
语句...
else
语句...
fi
这类双分支的语句,等前提满意的时分就会运转then前面的语句,前提不满意的时分就运转else前面的语句。
eg1:假如指定的用户存,先申明其已存在,并显现其ID号和SHELL;不然,就增加用户,并显现其ID号;
1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash
Username=mysql
ifid$Username&>/dev/null;then
Id=`grep"^$Username>"/etc/passwd|cut-d:-f3`
Shell=`grep"^$Username>"/etc/passwd|cut-d:-f7`
echo"$Usernameexist,IDis$Id,shellis$Shell."
else
useradd$Username
Id=`grep"^$Username>"/etc/passwd|cut-d:-f3`
echo"$UsernameIDis$Id."
fi
eg2:判别用户是不是存在,存在则显现ID和SHELL,不存在就增加用户,并显现其ID。
剖析:这题与上一个列子纷歧样的中央是这个用户没有指定,既然没有指定,就必要本人手动往shell一个参数,而剧本怎样往援用参数。这里就用到了bash变量中的地位变量
地位变量:$1,$2.....$9($1就是剧本传送的第一个参数...)
$0:剧本本身称号
$@:一切地位参数的列表
$*:一切地位参数
$#:地位参数的个数
1
2
3
4
5
6
7
8
9
10
#!/bin/bash
ifid$1&>/dev/null;then
Id=`grep"^$1>"/etc/passwd|cut-d:-f3`
Shell=`grep"^$1>"/etc/passwd|cut-d:-f7`
echo"$1exist,IDis$Id,shellis$Shell."
else
useradd$1
Id=`grep"^$1>"/etc/passwd|cut-d:-f3`
echo"$1IDis$Id."
fi
运转剧本basheg2.shmysql(eg.sh是剧本的称号,mysql是传送给剧本的第一个参数)
eg3:经由过程参数传送一系列用户名给剧本,让剧本增加这些用户;但要先判别用户是不是存在,不存在尔后再增加;增加完成后,显现一共增加了几个用户;固然,不克不及包含由于事前存在而没有增加的;
剖析:这个剧本不明白的是不晓得要传送几个参数,以是用地位变量有点不切合请求,以是援用了$@这个特别的变量,然后这些用户,你得一个一个的往取这些用户,然落后行判别是不是存在,用轮回把持了怎样一个一个的取这些用户,然后用户不克不及反复的一个一个的取,以是用户得取一个T失落$@列表中的用户,用了shift下令,shift下令就是轮番的T除用户。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#!/bin/bash
count=0
foruserin$@;do
ifid$1&>/dev/null;then
echo"user$1exsit."
shift
else
useradd$1
count=$[$count+1]
echo"add$1."
shift
fi
done
echo"totalusers:$count"
运转剧本
嵌套if语句(最多见的嵌套)
if[前提1];then
if[前提2];then
语句...
else
语句.....
fi
else
语句....
fi
这类嵌套的if语句就绝对庞大一点,当前提1满意时,就运转第一个then前面的语句,在前提1满意后,在判别前提2,当前提1和前提2同时满意的时分就会运转第二个then前面的语句,当只要前提1满意,前提2不满意就会运转第一个else前面的语句,假如前提1都不满意,那就间接运转第二个else前面的语句了。
eg4:判别一个用户,假如存在则判别是不是是一般用户,仍是体系用户,仍是admin用户。不存在则显现该用户不存在。
剖析:起首判别用户是不是存在,存在则对照用户的ID是不是为年夜于即是500,年夜于即是500则暗示为一般用户,是不是1-499,是则暗示为体系用户,是不是为0,是则为admin用户。
本例子还用到了数值的对照,然后还用到了前提的组合
linuxtest下令撑持数值对照、字符串对照、文件对照概况请mantest
数值对照
num1-eqnum2反省num1是不是即是num2
num1-genum2反省num1是不是>或即是num2
num1-gtnum2反省num1是不是年夜于num2
num1-lenum2反省num1是不是<即是num2
num1-ltnum2反省num1是不是<num2
num1-nenum2反省num1是不是不即是num2
组合前提测试
-a:与[$Uid-ge1-a$Uid-le499]
-o:或[$Uid-eq0-a$Uid-ge500]
!:非,单目操纵符[!$Uid-eq0]
1
2
3
4
5
6
7
8
9
10
11
12
13
#!/bin/bash
ifid$1&>/dev/null;then
Id=`grep"^$1>"/etc/passwd|cut-d:-f3`
if[$Id-ge500];then
echo"$1iscommonuser."
elif[$Id-lt500-a$Id-ge1];then
echo"$1issystemuser."
else
echo"$1isadminuser."
fi
else
echo"$1Notexist."
fi
剧本实行了局
eg5:判断用户的shell是不是为登录shell;
剖析:起首判别用户的shell是不是存在,redhat中有一个用户的shell就为空,假如shell存在则判别shell是不是为bash,假如是则暗示为登任命户,假如不是则暗示为不克不及登任命户。在redhat5.x的版本上。
字符串对照
str1=str2反省str1与str2是不是不异
str1!=str2反省str1与str2是不是分歧
str1<str2反省str1是不是小于str2
str1>str2反省str1是不是年夜于str2
-nstr1反省str1的长度是不是年夜于0
-zstr1反省str1的长度是不是为0
=~:判别右边的字符串是不是可以被右侧的形式所婚配,一般用于[[]];[["$opt1"=~pattern]],
一样平常锚定行首和行尾
1
2
3
4
5
6
7
8
9
10
11
#!/bin/bash
Shell=`grep"^$1:"/etc/passwd|cut-d:-f7`
if[-z$Shell];then
echo"$1usernoshell"
else
if["$Shell"=="/bin/bash"];then
echo"$1usershellisloginshell."
else
echo"$1usershellisnologinshell."
fi
fi
运转了局
eg6:判别以后主机的CPU临盆商,其信息在/proc/cpuinfo文件中vendorid一行中。假如其临盆商为GenuineIntel,就显现其为Intel公司;不然,就显现其为AMD公司;
1
2
3
4
5
6
7
#!/bin/bash
Vendor=`grep"vendor_id"/proc/cpuinfo|uniq|cut-d:-f2`
if[["$Vendor"=~[[:space:]]*GenuineIntel$]];then
echo"Intel"
else
echo"AMD"
fi
运转了局
[root@Redhat5test]#basheg6.sh
Intel
eg7:
写一个剧本:能够承受一个参数,其利用情势以下:
script.sh{start|stop|restart|status}
假如参数为start,创立空文件/var/lock/subsys/script,并显现“Startingscriptsuccessfully.”;
假如参数为stop,则删除文件/var/lock/subsys/script,并显现“Stopscriptfinished.”;
假如参数为restart,则删除文件/var/lock/subsys/script后从头创立,并显现“Restartingscriptsuccessfully.”;
假如参数为status,那末:
<pstyle="padding:0px;clear:both;height:auto;overflow:hidden;color:#2c2c2c;font-family:宋体,arialnarrow,arial,serif;font-size:14px;line-height:28px;background-color:#ffffff;margin-top:0px;margin-bottom:0px;"><strongstyle="padding:0px;margin:0px;"> |
|