仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 576|回复: 7
打印 上一主题 下一主题

[shell编程] 带来一篇shell剧本编程之挑选把持布局

[复制链接]
不帅 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-14 20:18:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

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;">
小女巫 该用户已被删除
沙发
发表于 2015-1-15 21:29:28 | 只看该作者

带来一篇shell剧本编程之挑选把持布局

尽量不要提问\\\\\\\"纯属是扯蛋.学习Linux特别是自己一个人初学入手的时候没人教很困难.当然如果可以的话平时多去买些Linux书...对学习Linux很有帮助.
乐观 该用户已被删除
板凳
发表于 2015-1-23 10:43:44 | 只看该作者
再次,Linux是用C语言编写的,我们有学习C语言的基础,读程序和编写代码方面存在的困难小一点,也是我们能较快掌握的原因之一。?
老尸 该用户已被删除
地板
发表于 2015-1-31 19:07:02 | 只看该作者
为什么要学Linux呢?每个人都有不同的看法,下面我说说自己的感想吧。?
5#
发表于 2015-2-19 20:57:25 | 只看该作者
要增加自己Linux的技能,只有通过实践来实现了。所以,赶快找一部计算机,赶快安装一个Linux发行版本,然后进入精彩的Linux世界,相信对于你自己的Linux能力必然大有斩获。
山那边是海 该用户已被删除
6#
发表于 2015-3-6 15:57:21 | 只看该作者
随着IT从业人员越来越多,理论上会有更多的人使用Linux,可以肯定,Linux在以后这多时间不会消失。
深爱那片海 该用户已被删除
7#
发表于 2015-3-13 05:07:22 | 只看该作者
众所周知,目前windows操作系统是主流,在以后相当长的时间内不会有太大的改变,其方便友好的图形界面吸引了众多的用户。
飘灵儿 该用户已被删除
8#
发表于 2015-3-20 13:43:07 | 只看该作者
即便是非英语国家的人发布技术文档,Linux也都首先翻译成英语在国际学术杂志和网络上发表。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-23 18:50

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表