6.shell脚本

6.1 shell基础语法

  6.1.1 shell的概述

      1.什么是shell

      2.系统提供了哪些种类的shell

        通过cat /etc/shells可查阅系统提供的shell

        

        本文主要介绍/bin/bash,因为它兼容于sh,它是依据使用者需求而对sh进行了加强

  6.1.2 shell中的变量

      1.什么是变量

      1.通过echo命令读取

        语法格式1: echo $变量名 

        语法格式2: echo ${变量名} 

        示例:

        读取登录用户名:echo $LOGNAME

        读取用户home目录:echo $HOME

        读取当前系统默认的shell:echo $SHELL

        

        注意:当变量名后面连着其他符号时,为了避免不必要的错误建议使用格式2

      1.环境变量的查看

        语法格式: env|more 

        

        设置环境变量使用set命令

      1.通过关键字:export

        语法格式1: export 变量名=变量值 

        语法格式2:变量名=变量值

              export 变量名

      1.变量与变量内容以一个等号"="连接,变量名=变量值

      2.等号两边不能直接接空格符,如(变量名 = 变量值)这是错误的

      3.变量名称只能是英文字符、数字、下划线组成,但是不能以数字开头

      4.变量内容若有空格符可使用双引号或者单引号将变量内容结合起来

        |-双引号中的特殊字符保有原本的特性

          |-例如:var="lang is ${LANG}",则echo $var的结果为lang is en_US.UTF-8

          

        |-单引号中的特殊字符仅为存文本(一般字符),就类似java中的String类型的数据

          |-例如:var='lang is ${LANG}',则echo $var的结果为lang is ${LANG}

          

      5.可以使用转义字符"\"将特殊符号(如$、\、!等)变为一般字符

      6.如果变量的内容是由其他命令提供的,需要使用$(命令)来获取变量的值

        |-示例

          

      1.为变量增加额外内容

        示例:

        

      2.取消变量的定义

        语法格式: unset 变量名 

        示例:

        

        注意:

        如果取消系统的环境变量,需要修改/etc/profile文件,不然不生效

        系统默认的变量通常变量名都为大写,自定义的变量建议使用小写,方便区分

      1.使用反引号(反引号为tab键上方的按键)

        语法格式: 变量名=·命令名· (使用反引号包住命令)

        示例:

        

        由示例看出,这种方式变量的值就为命令获取的值

      2.使用圆括号

        语法格式: 变量名=(命令) 

        示例:

        

        由示例看出,此种方式变量的值就是命令本身

      1.全局变量:

      2.局部变量:

      3.把一个命令定义成一个变量$(命令)或者·命令·

      4.若变量和其他字符组成新的变量就需要个变量加上大括号,否则容易出错如${date}day

  6.1.3 数据重定向

      1.数据重定向的基本概念

         

      1.数据重定向的命令及其对应的编号

        数据重定向对应的编号

        

        常用的组合命令及其含义

        

        示例:将ls的输出重定向到ls.log文件中

        

      2.使用数据重定向的方式书写内容到指定文件

        语法格式: cat > filename << "EOF" 

        输入此命令,此后所有的内容都会有">"提示输入,直到输入一个"EOF",才会关闭输入流

        示例:

        

      3.使用数据重定向测试执行程序

        对程序进行测试,就是看看能否执行成功,无需显示执行过程和信息

        示例:

        

        示例中,/dev/null,叫做"黑洞",把数据输出到此设备中,不会被保存,而是被丢弃

        2>&1:表示无论是错误的还是正确的信息都输出到/dev/null设备中

  6.1.4 命令回传值

      1.命令回传值的基本概念

      1.Linux系统中的短路与(&&)和短路或(||)

        短路与和短路或的应用

        

        示例:判断/temp/test是否存在,存在则创建/temp/test/test.txt

        

  6.1.5 常用的shell命令

      1.管道命令的基本概念

      2.grep命令

        

      3.示例

        将ls查询到的信息传递给grep命令进行搜索匹配文件夹名包含"ba"的内容

        

      1.find命令的功能

        find命令能够在一个目录中搜索文件,可以指定匹配条件,比如按文件名,文件类型等

      2.find命令及其常用选项

        语法格式: find [目录路径] [选项] 参数 

        常用选项:

        

      1.sed的基本概念

      2.sed逐行处理文件,并将结果发送到屏幕的具体过程

      3.sed命令的应用

        语法格式: sed [选项] "[动作]" fileName  

        常用选项:

        

        特殊选项:

           

        示例:修改源文件,同时想要修改后的源文件的内容显示在屏幕上

        

        常用动作:

        

        示例:sed "s/baiduhadoop/hadoop/g" demo.txt

        

        

        注意:

        想要修改源文件的内容,使用选项-i即可:sed -i "s/baiduhadoop/hadoop/g" demo.txt

        如果向输出到其他文件里sed  "s/baiduhadoop/hadoop/g" demo.txt > demo1.txt

        示例:应用多条sed的动作进行文件内容的修改

        方式1,通过-e选项:sed -e "s/h/H/g" -e "s/o/O/g" fileName

        方式2,通过在引号中添加分号的形式:sed "s/h/H/g;s/o/O/g" fileName

      1.sort命令的作用

      2.sort命令及其选项

        语法格式: sort [选项] 参数 

        常用选项:

       

      3.示例

      默认排序:

      

      指定的四段进行排序:

      

      1.cut命令的作用

        cut命令在文件中负责剪切数据用的,但是数据必须是有规则的数据

      2.cut命名及其常用选项

        语法格式: cut [选项] [参数] fileName 

        常用选项:

        

        示例:

        

        示例:剪切每一行的第5个到第7个字节

        

        示例:剪切每一行第6个字节之后的内容

        

        示例:剪切每一行,第6个字节之前的内容

        

      1.history命令的作用

        该命令用于显示历史执行过的所有命令

      2.历史命令的一些执行命令

        

6.2 shell高级-脚本

  6.2.1 shell script概述

      1.什么是shell script

        shell script就是以固定语法组织起来的存文本文件

        可以编译这个文件,让文件帮助我们一次执行多条命令

        可以通过一些运算与逻辑判断来达成较为复杂的功能

      2.shell script的注意事项

        命令的执行是从上而下,从左到右执行的

        命令、选项和参数间的多个空格会被忽略

        空白行也被忽略掉,tab被当成空格

        "#"后面的内容为注释,不会执行

        如果读取一个Enter符号,就会尝试开始执行该行命令

      1.直接执行

        假设程序文件名是:/home/shell.sh(该文件必须是可读可执行的权限(rx))

        通过绝对路径:运行/home/shell.sh

        

        通过相对路径:先cd到/home/,使用./shell.sh 执行

      2.通过source执行

        假设程序文件名是:/home/shell.sh(该文件必须是可读可执行的权限(rx))

        语法格式:source /home/shell.sh

        

 

      3.通过sh执行

        假设程序文件名是:/home/shell.sh(该文件必须是可读可执行的权限(rx))

        语法格式:sh /home/shell.sh

        

  6.2.2 shell脚本的编写

      1.提示用户输入两个数字,然后对这两个数字进行相乘,给用户返回结果

        #!/bin/bash

      #告诉用户本程序的功能,并且引导用户进行内容的输入
      echo "您好,请输入两个数字,我将对这两个数字进行乘法运行,给您返回结果!"

      #引导用户输入
      read -p "请输入第一个数字:" num1
      read -p "请输入第二个数字:" num2

      #计算结果,并返回
      mul=$(($num1*$num2))
      echo "您输入的两个数字${num1}*${num2}的结果是${mul}"

        代码执行的结果:

        

        以上脚本解析:

      1.test命令及其选项

        语法格式:test [选项] 参数

        常用选项:

        

      2.test判断字符串

        常用的字符串的判断

        

      3.编写一个脚本,判断文件时那种类型,具有哪些权限     

      #!/bin/bash
      #先给予提示
      read -p "请输入一个文件名,将对其判断文件类型及其权限" fileName

      #是否输入了文件名,如果为空,进行提示,并提示脚本
      test -z $fileName&&echo "您必须输入一个文件名" && exit 1

      #判断文件/目录是否存在?不存在则结束脚本
      test !-e $fileName && exit 2

      #判断文件类型及其统计文件具有哪些权限
      test -f $fileName && filetype="文件"
      test -d $fileName && filetype="目录"
      test -r $fileName && fileperm=""
      test -w $fileName && fileperm="${fileperm}-写"
      test -x $fileName && fileperm="${fileperm}-执行"

      #输出文件类型和文件所有的权限
      echo "您输入${fileName}的类型是${filetype},它具备的权限是${fileperm}"

      1.[]判断符号的作用

        []符号比较字符串,里边可用的符号:

        ==:等于

        !=:不等于

        []符号中的逻辑判断:

        -a:逻辑与

        -o:逻辑或

        []符号比较数字,里边可用的符号:

        

      2.注意点:

        在使用[]判断符的时候,一定要注意[]符号两边空格的使用,[]符号里边两边应保留一个空格

        

        []符号中不能使用:&&,||,>,<

  6.2.3 shell script的参数

      1.脚本参数的标识符

        常用的脚本参数的标识符

        

 

      2.编写一个脚本,查看各个标识的含义

      #!/bin/bash

      echo "the script name is==>$0"
      echo "total parameter number is==>$#"
      [ "$#" -lt 2 ]&&echo "the number of parameter is lt 2"&&exit 1
      echo "1st parameter==>$1"
      echo "2nd parameter==>$2"
      echo "your whole parameter is==$@" 
      exit 0

       代码执行结果:

      

      注意:此方式是脚本后面直接接参数传递给脚本,这些参数就被当做脚本的变量来使

      3.编写一个脚本,体现$@和$*的不同点

      #/bin/bash
      for i in "$*";do
      echo $i
      done
      echo "============="
      for i in "$@";do
      echo $i
      done

       代码执行结果:

      

      由以上结果可知:

        $@和$*都是获取所有的参数数据,但是$@获取的每一个参数是独立的

        $*获取的所有参数变成了一个整体

      1.shift的作用

        shift是用于偏移脚本的参数的,通常是用于参与执行过程的参数的"删除"

        这里的"删除"不是真的删除,而是将对应的参数标记,从而不去执行它

        例如:执行命令ls -a -R -l -h -d

        第一次执行的时候-a参数被执行,下一次执行ls的时候,-a参数不再参加执行就需要将它偏移

        即在程序中执行一次"shift"

      2.编写脚本,展示shift的用法

      #!/bin/bash
      echo "total parameter number is==>$#"
      echo "your whole parameter is==>$@"
      #shift one parameter
      shift
      echo "total parameter number is==>$#"
      echo "your whole parameter is==>$@"
      #shift three parameter
      shift 3
      echo "total parameter number is==>$#"
      echo "your whole parameter is==>$*

       代码执行结果:

      

 

  6.2.4 shell script的条件判断语句

      1.if条件判断语句语法格式

        语法格式1:

        if [ 条件判断 ]
        then
            //条件成立执行命令
        fi

        语法格式2:

        if [ 条件判断 ];then
            //条件成立执行命令;
        fi

      2.编写脚本,判断两个数的大小

        将参数写死在脚本中

        #!/bin/bash
        #比较两个数的大小
        a=2
        b=3
        if [ $a -gt $b ]
            then
            eche "$a>$b"
        fi
        if[ $a -le $b ];
          then
          echo "$a<=$b"
        fi

        通过用户输入的值来判断

        #!/bin/bash
        read -p "请输入两个数,用于判断他们的大小:" a b
        if[ $a -gt $b ];then
            echo "$a>$b"
        fi
        if[ $a -le $b ];then
            echo "$a<=$b"
        fi

        通过用户传参的方式来判断

        #!/bin/bash
        if[ $1 -gt $2 ];then
            echo "$1>$2"
        fi
        if[ $1 -le $2 ];then
            echo "$1<=$2"
        fi

      1.if else条件判断语句语法格式

        语法格式1:

        if  [ 条件1 ];then 
           条件1成立执行,指令集1  
        else  
           条件1不成执行指令集2;
         fi 

        语法格式2:

        if  [  条件1  ];then  
           条件1成立,执行指令集1
        elif  [  条件2  ];then 
          条件2成立,执行指令集2   
        else  
           条件都不成立,执行指令集3 
        fi 

  6.2.5 shell script循环语句

      1.不定循环while循环的语法

        语法格式1:

        while  [ condition ];do 
            命令   
        done 

        语法格式2:

        while  [ condition ] 
           do 
          命令   
        done 

      1.for……do……done循环语法结构

        语法格式:

        for  变量名 in 变量取值列表  
        do  
           命令  
        done 

      2.for循环中,变量取值列表可以多样化,特殊的可以使用命令的值来替代

        

      1.脚本语法正确性的检查

        刚开始学脚本,经常会遇到语法问题,运行有错误的脚本有时候会对系统产生一些影响

        可以通过sh命令来检查语法的正确性

        语法格式:sh [选项]

        

      2.注意点:

        -n选项不执行script,仅仅是检查语法的问题

        -v选项在执行script之前,先将script的内容输出到屏幕上

        -x选项将使用到的script内容显示到屏幕上

        

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

6.shell脚本

全文结束