shell脚本编程学习笔记

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell脚本编程学习笔记相关的知识,希望对你有一定的参考价值。

一、脚本格式

    vim shell.sh

      #!/bin/bash        //声明脚本解释器,这个‘#’号不是注释,其余是注释

      #Program:         //程序内容说明

      #History:          //时间和作者

二、shell变量的种类

    用户自定义变量:由用户自己定义、修改和使用

    与定义变量:Bash与定义的特殊变量,不能直接修改

    位置变量:通过命令行给程序传递执行的参数

    1、定义变量:

        变量名要以英文字母或下划线开头,区分大小写。

        格式:变量名=值

        输出变量:echo $变量名

    2、键盘输入为变量内容:

        格式:read [-p "信息"] 变量名

           如:read -p "pewase input your name:" name

    3、不同引号对变量的作用

      双引号"":可解析变量,$符号为变量前缀。

      单引号‘‘:不解析变量,$为普通字符。

      反引号``:将命令执行的结果输出给变量。

三、shell条件测试

    1、test命令:

      用途:测试特定的表达式是否成立,当条件成立时,命令执行后的返回值为0,否则为其他数字。

      格式:test 条件表达式 [ 条件表达式 ]   (注意:[]与表达式之间存在空格)

 

    2、常见的测试类型:

      测试文件状态

        格式:[ 操作符 文件或目录 ]

          如:if [ -d /etc ]

            then

              echo "exists"

            else

              echo "not exists"

            fi

      常见的测试操作符:

          -d:测试是否为目录

          -e:测试目录或文件是否存在

          -f:测试是否为文件

          -r:测试当前用户是否有读权限

          -w:测试当前用户是否有写权限

          -x:测试当前用户是否有执行权限

          -L:测试是否为符号链接文件

      字符串比较

        格式:[ 字符串1 = 字符串2 ]

           [ 字符串1 != 字符串2 ]

           [ -z 字符串 ]

          如:read -p ‘name:‘ name

            read -p ‘pass:‘ pass

            if [ $name = ‘admin‘ ] && [ $pass = ‘123‘]

            then

              echo ‘登录成功‘

            else

              echo ‘登录失败‘

            if

        常用的测试操作符:

          =:字符串内容相同。

          !=:字符串内容不同。

          -z:字符串内容为空。

      整数值比较

        格式:[ 整数1 操作符 整数2 ]

          如:age=30

            if [ $age -ge 18 ]

            then

              echo "已成年"

            else

              echo "未成年"

            fi

        常用的测试操作符:

          -eq:等于

          -ne:不等于

          -gt:大于

          -lt:小于

          -le:大于或等于

          -ge:小于或等于

      逻辑测试

        格式:[ 表达式1 ] 操作符 [ 表达式2 ]

        常用操作符:

          -a或&&:逻辑与

          -o或||:逻辑或

          !:逻辑非

四、流程判断:

    1、条件判断

       a、if语句

       格式:

          单分支:

            if 条件表达式

              then 命令序列

            fi

            如:age=30

              if [ $age -ge 18 ]

              then

                echo "已成年"

              else

                echo "未成年"

              fi

          多分枝:

            if 条件表达式

              then 命令序列

            elif 命令序列

            fi

            如:score=87

              if [ $score -lt 60 ];then

                echo ‘60以下‘

              elif [ $score -gt 60 ] && [ $score -lt 70 ];then

                echo ‘60~70之间‘

              elif [ $score -ge 70 ] && [ $score -lt 80 ];then

                echo ‘70~ 80之间‘

              else

                echo ‘优秀‘

              fi

          b、case

          格式:case $变量名称 in

               "第一个变量内容")

               ;;

               "第二个变量内容")

               ;;

             *)      //最后一个变量内容都会用*来代表其它值,不包含前面的变量内容

               ;;

             esac

            如:case $1 in

                start)

                   echo ‘start mysql service.‘

                  ;;

                stop)

                  echo ‘stop MYSQL service.‘

                  ;;

                *)

                  echo "Usage: $0 start|stop"

                  ;;

                esac

    2、循环控制

        跳出本次循环:continue

        结束循环:break

        a、while循环

        格式:while [ 条件表达式 ]

           do

              程序段落

          done

          如:num=3

            while [ $num -gt 0 ]

            do

              echo $num

              num=$(($num-1))

            done

        b、for循环

        格式:for var in con1 con2 con3

           do

              程序段

           done

           如:

           for i in user0 user1 user2 user3

             echo $i

           done

        格式:for ((i=0;i<10 1++))

           do

             程序段

           done

          如:for ((i=0;i<10;i++))

            do

              echo $i

              useradd user$i

              echo 123 | password --stdin_user$i

            done

    3、函数使用

        定义一个函数:在程序的最前面

          function 函数名(){}或者function 函数名{}

            如:function printit(){

                echo "your choice is $1"

              }

        调用:直接使用函数名

            如:printit 1

        传递参数:函数名 参数1 参数1

            如:printit 2

五、Shell文本操作

    1、Find查找命令的使用

        find . -name "*.text"      //在当前目录下查找已txt为后缀的文件

        fing .-name "[a-z]*"      //在当前目录下查找开头字母的文件

        find /etc -name "host*"    //查找/etc目录下以host开头的文件

        find . -perm 755        //在当前目录下查找属性为755的文件

        find -user root        //在当前目录下查找属主为root的文件

        find /var -mtime -5      //在/var下查找更改时间在5天内的文件

        find /var -mtime +3      //在/var下查找更改时间在3天以前的文件

        find /etc -type d        //查找文件类型为d的目录文件

        find /etc -typt l        //查找文件类型为l的链接文件

        find . -size +1000000c     //查找文件大小在1M的文件

    2、正则表达式

        ^linux        //以linux开头的

        $php        //以php结尾的

        .          //匹配任意单字符

        .+          //匹配任意多个字符

        .*          //匹配0个或多个字符

        [0-9a-z]       //匹配[]内任意一个字符

        (linux)+        //出现多次linux单词

        (web){2}       //web出现了2次以上

        \          //转译

    3、grep详解

        grep "li qq"*          //在所有文件中查找li qq文件

        grep -c "file" a          //在文件中查找有多少行匹配到file

        grep -n "file" a          //在文件中查找有多少行匹配file,同时显示行和行号

        grep -i "file" a          //在文件中查找file,并不区分大小写

        grep -v "file" a          //在文件中过滤掉file所在的行

        grep -E "2017:22:5[0-9]" a     //在文件中查找在时间在2017:22:50到59的所在行

        grep -E "^[^210]" a        //在文件中查找不号寒210的行

        grep -E "h*p" a          //查找包含h和p的行

        grep -E "[5-8][6-9][0-3]" a    //查找大于560小于893的行

        grep -E "^d" a          //在文件中查找以d开头的行

        grep -E "^[^d]" a          //在文件中查找不是以d开头的行

    4、awk命令:

        简介:awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大。简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理。

            awk语言的最基本功能是在文件或者字符串中基于指定规则浏览和抽取信息,awk抽取信息后,才能进行其他文本操作。完整的awk脚本通常用来格式化文本文件中的信息。

通常,awk是以文件的一行为处理单位的。awk每接收文件的一行,然后执行相应的命令,来处理文本。

        格式:awk ‘{pattern + action}‘ {filenames}

            pattern:查找内容

            action:匹配规则

          awk ‘{pring $0}‘ access.log              //查找文件中的每一列

          awk ‘{print $1"\t"$7}‘ access.log           //查找文件中第一列和第七列

          cat file | awk ‘$0 !~ /192.168.31.25/‘|grep "php"    //匹配Ip 地址的统计,!~为不匹配

          例:for i in `cat /etc/passwd | head | awk -F:‘{print $1}‘`

            do

              echo $i

            done

              -F---以什么符号分割

              head---去前多少行,默认是10行

    5、sed行定位使用

        简介:sed是非交互式的编辑器。它不会修改文件,除非使用shell重定向来保存结果。默认情况下,所有的输出行都被打印到屏幕上。

 选项  功能
 -e  进行多项编辑,即对输入行应用多条sed命令时使用
 -n  取消默认的输出
 -f  指定sed脚本的文件名

        sed -n ‘2‘p file        //只打印第二行,不打印其他行

        sed -n ‘1,4‘p file       //从第一行到第四行的记录

        sed -n ‘/los/‘p file      //打印匹配los的行

        sed -n ‘4,/los/‘p file     //打印从第四行到匹配los的之间所有行

        sed ‘1,2‘d file        //吧第一行和第二行全部删除

    6、Uniq行定位使用

        简介:uniq命令用于报告或忽略文件中的重复行,一般与sort命令结合使用。

        语法 uniq(选项)(参数)

        选项 :

           -c或——count:在每列旁边显示该行重复出现的次数;

           -d或--repeated:仅显示重复出现的行列;

           -f<栏位>或--skip-fields=<栏位>:忽略比较指定的栏位;

           -s<字符位置>或--skip-chars=<字符位置>:忽略比较指定的字符;

           -u或——unique:仅显示出一次的行列;

           -w<字符位置>或--check-chars=<字符位置>:指定要比较的字符。

        uniq -c file          //打印紧挨的重复行出现的次数

        uniq -d file          //只打印重复的行

        awk ‘{print $1}‘ /var/log/httpd/access_log | sort|uniq -c        //把apache网站的所有访问ip全部统计出来,并打印出统计次数。

    7、spli行定位

        简介:可以将一个大文件分割成很多个小文件,有时需要将文件分割成更小的片段,比如为提高可读性,生成日志。

        语法:split(选项)(file)PREFIX

        选项:

          -b:值为每一输出档案的大小,单位为 byte。
          -C:每一输出档中,单行的最大 byte 数。
          -d:使用数字作为后缀。
          -l:值为每一输出档的列数大小。
          PREFIX:代表前导符,可作为切割文件的前导文件。

        split -2 file spt        //生成fileab,fileac....fileai等多个文件,把a文件每行分割成一个文件,每个文件的前缀都是以file开头的。




以上是关于shell脚本编程学习笔记的主要内容,如果未能解决你的问题,请参考以下文章

Linux学习笔记-Shell教程

linux学习笔记--工程师技术:shell脚本基础

代码片段:Shell脚本实现重复执行和多进程

Linux学习笔记:bash颜色显示及shell脚本相关

shell脚本编程学习笔记-shell脚本编程基础介绍

shell脚本学习笔记一