一、脚本格式

    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脚本编程学习笔记(一)的更多相关文章

  1. Linux Shell脚本编程学习笔记和实战

    http://www.1987.name/141.html shell基础 终端打印.算术运算.经常使用变量 Linux下搜索指定文件夹下特定字符串并高亮显示匹配关键词 从键盘或文件里获取标准输入 [ ...

  2. shell脚本编程学习笔记(三)编写邮件报警脚本

    一.shell编写邮件报警脚本 1.POSTFIX邮件服务器准备 a.首先卸载服务器上自带的sendmail rpm -qa sendmail* //查看安装的sendmail rpm -e send ...

  3. shell脚本编程学习笔记(四)shell操作数据库

    一.数据库基本操作 1)登录mysql服务器:mysql -u root -p 密码 2)查看数据库:show databases 3)查看表:show tales from db; 4)查看表结构: ...

  4. shell脚本编程学习笔记(二)linux服务器启动流程

    一.linux服务器启动流程 1.bios找到磁盘上的mbr主引导扇区 2.进入grub洁面选择相应的启动内核 3.读取kernel内核文件-/boot/vmlinuz-* 4.读取init的镜像文件 ...

  5. Bash脚本编程学习笔记08:函数

    官方资料:Shell Functions (Bash Reference Manual) 简介 正如我们在<Bash脚本编程学习笔记06:条件结构体>中最后所说的,我们应该把一些可能反复执 ...

  6. Bash脚本编程学习笔记07:循环结构体

    本篇中涉及到算术运算,使用了$[]这种我未在官方手册中见到的用法,但是确实可用的,在此前的博文<Bash脚本编程学习笔记03:算术运算>中我有说明不要使用,不过自己忘记了.大家还是尽量使用 ...

  7. Shell脚本编程学习入门 02

    Shell脚本编程学习入门是本文要介绍的内容,我们可以使用任意一种文字编辑器,比如gedit.kedit.emacs.vi等来编写shell脚本,它必须以如下行开始(必须放在文件的第一行):   #! ...

  8. Bash脚本编程学习笔记06:条件结构体

    简介 在bash脚本编程中,条件结构体使用if语句和case语句两种句式. if语句 单分支if语句 if TEST; then CMD fi TEST:条件判断,多数情况下可使用test命令来实现, ...

  9. Shell脚本编程学习入门 01

    从程序员的角度来看, Shell本身是一种用C语言编写的程序,从用户的角度来看,Shell是用户与Linux操作系统沟通的桥梁.用户既可以输入命令执行,又可以利用 Shell脚本编程,完成更加复杂的操 ...

随机推荐

  1. P2214 [USACO14MAR]哞哞哞Mooo Moo

    链接:Miku ---------------------- 这道题还是个背包 --------------------- 首先看一下声音的组成,对于每一个农场的声音,它是由两部分组成的 :上一个农场 ...

  2. 一个C语言程序是由( )组成?

    A) 一个主程序和若干子程序组成 B)一个或多个函数组成 C) 若干过程组成 D) 若干子程序组成 正确答案 B 解析 [解析] 一个C源程序是由一个main函数和若干个其他函数组成的.函数是C程序的 ...

  3. C# 如何获取日期时间各种方法

    我们可以通过使用DataTime这个类来获取当前的时间.通过调用类中的各种方法我们可以获取不同的时间:如:日期(2019-01-09).时间(16:02:12).日期+时间(2019-01-09 16 ...

  4. JS 数组常见操作汇总,数组去重、降维、排序、多数组合并实现思路整理

    壹 ❀ 引 JavaScript开发中数组加工极为常见,其次在面试中被问及的概率也特别高,一直想整理一篇关于数组常见操作的文章,本文也算了却心愿了. 说在前面,文中的实现并非最佳,实现虽然有很多种,但 ...

  5. JSP页面取不到ModelAndView里面存的值

    方法1:在jsp页面上加上<%@ page isELIgnored="false" %>

  6. drf 接口文档

    coreapi 参考点击 swagger风格接口文档 参考 参考用例 swagger 使用参考

  7. Project Euler 133: Repunit nonfactors

    题意 英文 做法 结论1:\(R(a)|R(am)(a,m\ge 1)\) \[\frac{R(am)}{R(a)}=\frac{\frac{10^{am}-1}{9}}{R(a)}=\frac{\f ...

  8. arm的字节对齐问题总结(转)

    问题由来:pc的lsb总是0,因为代码至少要字对齐.cm3的指令至少是半字对齐的(16) 一.啥是字对齐?为啥要字对齐? 现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访 ...

  9. IntelliJ Pycharm 2019年最新版 安装激活教程【最强,可用至2089、2100年】

    本文为2019年Pycharm最新版安装永久激活教程 PyCharm 2019.3 (Professional Edition) ①IntelliJ Pycharm 2019.3安装永久破解[最强] ...

  10. H5_0012:js事件冒泡和捕获

    捕获(capture)和冒泡(bubble)是事件传播过程中的两个概念, 比如用户单击某个元素, 但由于元素处于父元素内, 该父元素又处于document对象中, document对象又处于windo ...