Shell
条件判断——程序根据间断结果云执行,对不同对象做间断是要用不同的选项
命令 [ 条件表达式 ]
Test 条件表达式
文件状态
-e 是否存在 存在为真 反之为假
-f ——file 是不是文件 是文件为真
-d ——directory 是不是目录 是目录为真
-r ——read 有没有读权限 有读权限为真
-w ——write 有没有写权限 有写权限为真
-x ——execute 有没有执行权限 有执行权限为真
整数值比较
Num1 选项 num2
-eq ——equal 相等为真
-ne 不相等为真
-gt ——greater than 大于为真
-ge 大于等于为真
-lt ——less than小于为真
-le 小于等于为真
字符比较
String1 选项 string2
= 两个字符串比较——相等为真
!= 两个字符串比较——不相等为真
-z string 字符串为空 为真
!-z string 字符串为空 为真
逻辑比较——两个或两个以上判断条件时使用逻辑比较
逻辑与 && 多个判断条件同时成立
逻辑或 || 多个判断条件只需要有一个判断条件成立
逻辑非 ! 取反
运算符号
+ - * / %(求模)——取余
运算命令
#expr 算数表达式——默认返回运算结果,只能做整数运算
[root@localhost bk]# expr 10 * 20
expr: 语法错误
[root@localhost bk]# expr 10 * 20 为转义符
200
++ 自加运算——每次自加1把自加1的结果在赋值给自己
-- 自减运算——每次自减1把自减1的结果在赋值给自己
#let 适合做自加、减运算 不返回运算结果
#let num++
#num=`expr $num + 1`
+= -= *= /= %= 设置运算时的步长
其他运算符号
$[运算表达式]
$((运算表达式))
++ 与 -- 可在变量前或变量后
列
#i++ 先调用变量,在运算
#++I 先运算,在调用变量
#i-- 先调用变量,在运算
#--I 先运算,在调用变量
小数比较
比较符号 > >= < <= == !=
表达式成立,返回值为真,就是1——反之就是0
[root@localhost shell]# echo "1.11 > 1.12"|bc
0
小数运算
[root@localhost shell]# echo "scale=4;4/3"|bc
1.333
流程控制——执行流程控制时,根据条件判断的结果去执行对就当的代码
选择结构 if
循环结构 for while C-for until
分支结构 case
他们是平等的,在写脚本时,彼此可以互相嵌套使用,也可以嵌套自已,同一种流程控制可以一个脚本多次使用
选择结构
单分支结构——单选 只有一个判断条件
格式 if 条件判断;then
代码块
Fi
或 If 条件判断
then
代码块
Fi
执行脚本方式
不需要执行权限
Sh 脚本名
Bash 脚本名
需要执行权限
./脚本名或./路径/脚本名
下面两个命令,执行脚本时,脚本中运行的命令所产生的进程,占用脚本运行终端的执行
. 脚本名
Source 脚本名
结束脚本执行可使用 exit
双分支结构——双选 有两个判断条件
格式 if 条件判断;then
条件判断成立时执行的代码块
Else
条件判断不成立时执行的代码块
Fi
多分支结构——多选 有多个判断条件
格式 if 条件判断1;then
条件判断1成立时执行的代码块
Elif 条件判断2;then
条件判断2成立时执行的代码块
Elif 条件判断3;then
条件判断3成立时执行的代码块
……
Elif 条件判断N;then
条件判断N成立时执行的代码块
ELSE
当所有条件都不成立时,执行代码块
Fi
循环结构 for while C-for until
脚本有重复执行的代码时使用循环结构
格式 for 变量名 in 变量值列表
Do
循环体
Done
造数工具
[root@localhost shell]# seq 100 1 104———————格式为seq 开始数——默认为1 步长——默认为1 结束
100
101
102
103
104
[root@localhost shell]# echo {1..4}
1 2 3 4
[root@localhost shell]# echo {a..g}
a b c d e f g
不换行-n
取1到10偶数
[root@localhost shell]# bash for1
2 4 6 8 10
测试IP,有几台主机可以ping通
While循环结构
格式while 条件判断
Do
循环体
Done
使用while添加5个用户,默认密码,首次登录强制改密码
输出以下效果,使用个while语句
5 4 3 2 1
使用(C-for)
For((赋初值;条件判断;步长));do
循环体
Done
输出以下效果,使用个C-for语句
5 4 3 2 1
Until循环结构——条件判断不成立时,执行循环体,条件判断成立经胩循环
格式 Until 判断
Do
循环体
Done
分支结构 case
格式 case "$变量名" in
值1)
执行的代码
…
;;
值2)
执行的代码
…
;;
值n)
执行的代码
…
;;
Esac
使用脚本显示当前星期几
[root@localhost shell]# bash 1
this is 星期五 Friday
流程控制函数
控制循环结构的执行
break 结束自己所在循环的执行
continue 结束自己所在循环结构的本次循环,并开始下一次循环
exit 结束脚本的执行——exit 后面的值默认是0——如需设置exit 4————即可
输出
欠套for——9*9乘法表
shell位移函数——/bin/bash内置函数
在脚本中使用一次shift函数,会脚本或函数位置参数的值顺序向左移动1位,并把没有的值的位置变量删除
执行脚本后面的数字之和
执行脚本后面数字相减
shell自定义函数
函数——把脚本中重复使用,实现某种功能的代码封装起来,定义一个名字
如何定义函数
格式 function 函数名 {
函数体
...
}
或
函数名() {
函数体
...
}
使用函数——函数名
函数使用规则
在脚本里使用函数时,要先定义后调用
函数名相同时后定义的生效,函数名区分字母大小写
函数内定义的变量是局部变量,只能在函数内使用,函数体外定义的变量是全局变量,所有函数都可能使用
函数之间可以互相调用
函数也可以递归调用(自己调用自己)
.(){ . | . & } ; .
称为FORK炸弹
1 众所周知,bash是一款极其强大的shell,提供了强大的交互与编程功能。这样的一款shell中自然不会缺少“函数”这个元素来帮助程序进行模块化的高效开发与管理。于是产生了由于其特殊的特性,bash拥有了fork炸弹。Jaromil在2002年设计了最为精简的一个fork炸弹的实现。 2 3 所谓fork炸弹是一种恶意程序,它的内部是一个不断在fork进程的无限循环,fork炸弹并不需要有特别的权限即可对系统造成破坏。fork炸弹实质是一个简单的递归程序。由于程序是递归的,如果没有任何限制,这会导致这个简单的程序迅速耗尽系统里面的所有资源。现在来看看Jaromil设计的最简单的fork炸弹: 4 5 :() { :|:& };: 6 7 或者 8 9 .() { .|.& };. 10 11 一行看似无法理解的只有13个字符的命令,即可占用掉所有系统的资源。其实,这行命令如果这样写成bash script就不难理解了: 12 13 :() 14 { 15 :|: & 16 } 17 ; 18 : 19 20 * 第 1 行说明下面要定义一个函数,函数名为小数点,没有可选参数。 21 * 第 2 行表示函数体开始。 22 * 第 3 行是函数体真正要做的事情,首先它递归调用本函数,然后利用管道调用一个新进程(它要做的事情也是递归调用本函数),并将其放到后台执行。 23 * 第 4 行表示函数体结束。 24 * 第 5 行并不会执行什么操作,在命令行中用来分隔两个命令用。从总体来看,它表明这段程序包含两个部分,首先定义了一个函数,然后调用这个函数。 25 * 第 6 行表示调用本函数。 26 27 冒号”:”其实是函数名,这个bash脚本就是在不断的执行该函数,然后不断fork出新的进程。 28 29 对于函数名,大家可能会有所疑惑,小数点也能做函数名使用吗?毕竟小数点是 shell 的一个内嵌命令,用来在当前 shell 环境中读取指定 文件,并运行其中的命令。实际上的确可以,这取决于bash对命令的解释顺序。
源码包 进程所有者所属组为daemon
RPM包所有者所属组为apache
Ps aux |grep httpd
[root@localhost htdocs]# pwd
/usr/local/apache2/htdocs
elinks -dump http://127.0.0.1
停止服务可以用杀进程方式
当服务启动时——会启用一个父进程,下面是该PPID号
[root@localhost ~]# cat /usr/local/apache2/logs/httpd.pid
8975
列子:安装httpd源码包,写出服务脚本
下载httpd源码包,解压,安装
1 tar xf httpd-2.2.31.tar.bz2 2 cd httpd-2.2.31 3 yum -y install gcc gcc* 4 ./configure 5 ./configure --prefix=/usr/local/apache2 6 make && make install
服务脚本
1 #!/bin/bash 2 # chkconfig: - 85 15 3 export PATH=/usr/local/apache2/bin/:$PATH 4 name=apache_httpd 5 6 start(){ 7 apachectl start &> /dev/null 8 echo "$name is start..." 9 } 10 11 stop(){ 12 apachectl stop &> /dev/null 13 echo "$name is stop..." 14 } 15 16 status(){ 17 nmap -sT 127.0.0.1 -p 80 |grep open &> /dev/null 18 if [ $? -eq 0 ];then 19 echo "$name is running..." 20 else 21 echo "$name is stoped..." 22 fi 23 } 24 25 restart(){ 26 stop &>/dev/null 27 start &>/dev/null 28 echo "$name is restart..." 29 } 30 case $1 in 31 start) 32 start 33 ;; 34 stop) 35 stop 36 ;; 37 status) 38 status 39 ;; 40 restart) 41 restart 42 ;; 43 *) 44 echo "this is $name {start|stop|status|restart}" 45 esac
解释:
第2行中的——chkconfig: - 85 15
:后面分3列——第1列代表——启用级别
[root@localhost init.d]# chkconfig --list apache_httpd
apache_httpd 0:off 1:off 2:on 3:on 4:on 5:on 6:off
——第二列85代表——启用优先级
[root@localhost rc3.d]# ls /etc/rc3.d/|grep S85
S85apache_httpd
——第三列15代表——关闭优先级
[root@localhost rc3.d]# chkconfig apache_httpd off
[root@localhost rc3.d]# ls /etc/rc5.d/|grep K15
K15apache_httpd
K15htcacheclean
K15httpd
第3行——export PATH=/usr/local/apache2/bin/:$PATH 路径
第17行——nmap -sT 127.0.0.1 -p 80 |grep open
nmap是一个软件包——抓包软件——需要手动安装yum -y install nmap