Day2-运算+流程控制+函数

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

原文地址:https://www.cnblogs.com/fina/p/5807607.html