• 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

  • 相关阅读:
    创建线程的多种方式
    第六届蓝桥杯大赛个人赛省赛(软件类)C语言B组--2015年
    第七届蓝桥杯大赛个人赛省赛(软件类)C语言B组--2016年
    postgressql安装
    freebsd上安装nginx+php记录
    ubuntu cpus 共享打印
    查找表_leetcode219
    查找表_leetcode217
    查找表_leetcode202
    查找表_leetcode205
  • 原文地址:https://www.cnblogs.com/fina/p/5807607.html
Copyright © 2020-2023  润新知