6.shell脚本

摘要:
它根据用户的需要加强了shell中变量的基本概念

6.1 shell基础语法

  6.1.1 shell的概述

    • shell的基本概念

      1.什么是shell

        • shell是用户和Linux操作系统之间的接口,它提供了与操作系统之间的通讯方式
        • shell是一个命令解释器,它接收用户发出的命令,然后调用相应的应用程序

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

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

        6.shell脚本第1张

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

  6.1.2 shell中的变量

    • shell中变量的基本概念

      1.什么是变量

        • 变量是值可以改变的量,在计算机中变量能存储计算结果或者表示某一个值
        • 例如:y = x + 1,其中y就是变量
    • 变量的读取

      1.通过echo命令读取

        语法格式1: echo $变量名 

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

        示例:

        读取登录用户名:echo $LOGNAME

        读取用户home目录:echo $HOME

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

        6.shell脚本第2张

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

    • 环境变量的设置与查看

      1.环境变量的查看

        语法格式: env|more 

        6.shell脚本第3张

        设置环境变量使用set命令

    • 将普通变量变为环境变量

      1.通过关键字:export

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

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

              export 变量名

    • 局部变量的设置规则

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

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

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

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

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

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

          6.shell脚本第4张

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

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

          6.shell脚本第5张

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

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

        |-示例

          6.shell脚本第6张

    • 变量的其他操作

      1.为变量增加额外内容

        示例:

        6.shell脚本第7张

      2.取消变量的定义

        语法格式: unset 变量名 

        示例:

        6.shell脚本第8张

        注意:

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

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

    • 把一个命令定义成一个变量

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

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

        示例:

        6.shell脚本第9张

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

      2.使用圆括号

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

        示例:

        6.shell脚本第10张

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

    • 变量总结

      1.全局变量:

        • 一般全大写,比如环境变量

      2.局部变量:

        • 在脚本函数中的局部变量通常使用local修饰
        • local I :表示变量i的有效范围在该函数的内部有效

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

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

  6.1.3 数据重定向

    • 数据重定向概述

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

        • 数据重定向就是将某个命令执行后应该要出现在屏幕上的数据,给它传输到其他的地方
        • 通常执行一条命令的时候会有标准输出和标准错误输出
        • 标准输出:是指命令执行之后,传回正确信息的输出目标
        • 标准错误输出:是指命令执行失败后,所传回错误信息的输出目标

          6.shell脚本第11张

    • 数据重定向的应用

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

        数据重定向对应的编号

        6.shell脚本第12张

        常用的组合命令及其含义

        6.shell脚本第13张

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

        6.shell脚本第14张

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

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

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

        示例:

        6.shell脚本第15张

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

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

        示例:

        6.shell脚本第16张

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

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

  6.1.4 命令回传值

    • 命令回传值概述

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

        • 在Linux系统中,一个命令执行完之后,必然会有一个回传值,作用是用于判断命令是否执行成功
        • 在Linux系统中,回传值为0表示的含义就类型java中的true,其他数字均表示为false
        • Linux中通过:echo $?,来获取回传值
    • 命令回传值的应用

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

        短路与和短路或的应用

        6.shell脚本第17张

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

        6.shell脚本第18张

  6.1.5 常用的shell命令

    • 管道符及grep命令

      1.管道命令的基本概念

        • 在Linux系统中"|"表示管道符,用它来讲两个命令隔开
        • 管道符左边命令的输出会作为管道符右边命令的输入
        • 连续使用管道符就表示第一个命令的输出会作为第二个命令的输入,第二个命令的输出又会作为第三命令的输入,以此类推

      2.grep命令

        • 查看源系统解释可知grep命令,是通过正则表达式搜索对应的文件或者是打印出来通过正则表达式匹配到的内容

        6.shell脚本第19张

      3.示例

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

        6.shell脚本第20张

    • find命令

      1.find命令的功能

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

      2.find命令及其常用选项

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

        常用选项:

        6.shell脚本第21张

    • sed命令

      1.sed的基本概念

        • sed是非交互式文本处理工具,在默认情况下,sed将所有输出的行打印到屏幕上
        • sed可以通过数据重定向的方式,将输出的内容保存到某个文件里

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

        • sed把当前正在处理的行保存在一个临时缓冲区
        • 然后处理临时缓冲区中的行,完成后把该行发送到屏幕上
        • sed每处理完一行就将其从临时缓冲区删除,然后将下一行读入,进行处理和显示
        • 处理完输入文件的最后一行,sed变结束运行
        • sed把每一行都存在临时缓冲区中,然后对缓冲区这个副本进行编辑,所以源文件不会发生改变

      3.sed命令的应用

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

        常用选项:

        6.shell脚本第22张

        特殊选项:

           6.shell脚本第23张

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

        6.shell脚本第24张

        常用动作:

        6.shell脚本第25张

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

        6.shell脚本第26张

        6.shell脚本第27张

        注意:

        想要修改源文件的内容,使用选项-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

    • sort命令

      1.sort命令的作用

        • sort是将文件/文本的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较

      2.sort命令及其选项

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

        常用选项:

        6.shell脚本第28张

      3.示例

      默认排序:

      6.shell脚本第29张

      指定的四段进行排序:

      6.shell脚本第30张

    • cut命令

      1.cut命令的作用

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

      2.cut命名及其常用选项

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

        常用选项:

        6.shell脚本第31张

        示例:

        6.shell脚本第32张

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

        6.shell脚本第33张

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

        6.shell脚本第34张

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

        6.shell脚本第35张

    • history历史命令

      1.history命令的作用

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

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

        6.shell脚本第36张

6.2 shell高级-脚本

  6.2.1 shell script概述

    • shell script的基本概念

      1.什么是shell script

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

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

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

      2.shell script的注意事项

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

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

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

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

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

    • shell script如何执行

      1.直接执行

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

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

        6.shell脚本第37张

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

      2.通过source执行

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

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

        6.shell脚本第38张

      3.通过sh执行

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

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

        6.shell脚本第39张

  6.2.2 shell脚本的编写

    • 编写一个交互式脚本

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

        #!/bin/bash

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

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

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

        代码执行的结果:

        6.shell脚本第40张

        以上脚本解析:

        • 第一行#!/bin/bash,告诉系统如何执行脚本。当采用直接执 行(不是用类似sh  xxx.sh这样的方式)时,此行必须有,且要放在首行。
        • 除了第一行的之外#都是注释,其他为程序部分。
        • read   -p  "提示信息" 变量名,用于给客户进行信息提示,用户输入的结果作为变量的值
        • echo 后面为返回值,返回到屏幕
    • test判断命令

      1.test命令及其选项

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

        常用选项:

        6.shell脚本第41张

      2.test判断字符串

        常用的字符串的判断

        6.shell脚本第42张

      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:逻辑或

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

        6.shell脚本第43张

      2.注意点:

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

        6.shell脚本第44张

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

  6.2.3 shell script的参数

    • 脚本参数的的标识

      1.脚本参数的标识符

        常用的脚本参数的标识符

        6.shell脚本第45张

      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

       代码执行结果:

      6.shell脚本第46张

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

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

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

       代码执行结果:

      6.shell脚本第47张

      由以上结果可知:

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

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

    • shift参数变量号码的偏移

      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.shell脚本第48张

  6.2.4 shell script的条件判断语句

    • if条件判断语句

      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
    • if else条件判断语句

      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循环语句

    • while循环语句

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

        语法格式1:

        while  [ condition ];do 
            命令   
        done 

        语法格式2:

        while  [ condition ] 
           do 
          命令   
        done 
    • for循环语句

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

        语法格式:

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

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

        6.shell脚本第49张

    • sh脚本语法的检查

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

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

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

        语法格式:sh [选项]

        6.shell脚本第50张

      2.注意点:

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

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

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

        

 

 

免责声明:文章转载自《6.shell脚本》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇android 定时器的使用PHP实现执行定时任务的几种思路详解下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

随便看看

WebView2简单试用(二)—— 基本操作

页面跳转可以通过webview实现interface://www.cnblogs.com/tianfang/“);其他操作其他常见操作已经很好地封装在WebView2控件中。网页跳转事件WebView2常见的网页跳转事件包括:更多事件可以参考API文档:快捷键F12。快捷键Ctrl+Shift+I。右键菜单中的“检查”,这为调试提供了极大的便利。...

db2 reorg详解

reorgchk,检查tableindex是否需要重组。reorg重组,重新放置数据位置。5)db.tb_reorg_req运行状况指示器处于ATTENTION状态。可以分为对系统表和用户表两部分分别进行REORGCHK:1)针对系统表进行REORGCHKdb2reorgchkupdatestatisticsontablesystem使用UPDATESTAT...

flutter Radio单选框

单选框,允许用户从一组中选择一个选项。...

Winform知识点

BringToFront()将控件移动到Z顺序的前面。...

GitLab的基础使用-创建用户(users)

否则,将追究法律责任。1、 以管理员身份登录GitLab的WebUI,并创建用户1˃使用管理员登录GitLab。管理员登录成功后,点击下图所示的小扳手,然后点击进入管理员的Dashboard界面。如果时间间隔过长,可以要求运维人员重置密码。操作和维护人员可以参考第一步来重置用户的密码。实际上,您也可以通过参考第三步中的方法找到自己的密码,而不必麻烦操作和维护...

Windows10 解除公司换壁纸限制

桌面点右键,属性,就可以改自己喜欢的桌面背景了。...