美文网首页Linux
shell脚本编程快速入门(一)

shell脚本编程快速入门(一)

作者: 秃头猿猿 | 来源:发表于2020-06-15 16:08 被阅读0次

    参考:《shell脚本-菜鸟教程》

    1.shell脚本简介

    1.1. 什么是shell

    百度百科解释如下:

    image-20200615111228918

    1.2 . 什么是脚本

    百度百科解释如下:

    image-20200615111343779

    脚本语言又被称为扩建的语言, 或者动态语言, 是一种编程语言, 用来控制软件应用程序, 脚本通常是以文本 (ASCⅡ) 保存, 只是在被调用时进行解释或者编译

    简单的来说:

    就是一条条可执行的命令。这些命令保存在一个文本文件里面,称为脚本文件。

    常见的脚本文件有: Javascript脚本,sql脚本,shell脚本,jsp脚本等等

    1.3 什么是shell脚本

    百度百科 解释如下:

    image-20200615121637072

    简单的来说

    就是把各种linux命令放入存放到一个文本文件中,然后去执行这个文本文件,就像把所有的SQL放入到一个文本中,然后去执行SQL文件是一样的道理

    1.4 shell脚本好处

    • 提交程序开发效率
    • 批量处理,加快任务完成进度

    2. shell分类

    • Bourne Shell

      UNIX 最初使用的 shell,并且在每种 UNIX 上都可以使用, 在 shell 编程方面相当优秀,但在处理与用户的交互方面做得不如其他几种shell。

    • Bourne Again Shell(/bin/bash)

      Linunx默认的shell,是Bourne shell 的扩展,简称 Bash,与 Bourne shell 完全向后兼容,并且在Bourne Shell基础上加了很多新的特性。因此也更加灵活。所以一般来说shell脚本都会执行它为执行路径。也可以认为

    • C Shell

      主要是为了让用户更容易的使用交互式功能,并把ALGOL风格的语法结构变成了C语言风格。它新增了命令历史、别名、文件名替换、作业控制等功,其内部命令共有52个,现在已经被tc shell所取代了。

    • K Shell

      Korn shell 是与 Bourne shell 向后兼容的,并且包含大部分的 Bourne shell 的特点和几个 C shell 的最好特点。许多安装脚本都是用了ksh,其内部共有42条命令。

    • TC Shell

      Tcsh是csh的增强版,并且完全兼容csh。它不但具有csh的全部功能,还具有命令行编辑、拼写校正、可编程字符集、历史纪录、作业控制等功能,以及C语言风格的语法结构。

    3. shell 快速入门

    3.1 准备工作

    • 安装Linux系统,这里我安装虚拟机。配置如下:

      image-20200615140614256

    3.2 shell -helloword

    • 在当前文件夹下新建一个hello.sh

      image-20200615140830090

      解释:

      shell脚本文件后缀名必须为 xx.sh

    • 文件内容如下

      #!/bin/bash
      #这是一个注释
      echo '这是第一个脚本'
      

      解释:

      脚本文件第一行必须为#!/bin/bash.其含义是告诉系统脚本文件的解释器路径是什么。

      shell脚本里面的注释为: #注释

      echo 输出语句,类似于java中System.out.print

    • 修改文件权限

      image-20200615141453003

      解释:

      既然hello.sh是一个脚本文件,那么就需要去执行,可是创建出来的文件没有执行权限,因此需要增加执行权限。

      chmod +x hello.sh
      
    • 执行脚本

      ./hello.sh
      
      image-20200615141743283

      注意:

      ​ 一定要写成./hello.sh,如果写成hello.sh,那么就会出现下面的错误

      image-20200615141858511

      这是因为直接写hello.sh,linux 系统会去 PATH里寻找有没有叫 hello.sh 的,而只有 /bin,/sbin, /usr/bin/usr/sbin 等在 PATH 里,而当前目录通常不在 PATH 里,所以写成 hello.sh 是会找不到命令的,要用 ./hello.sh 告诉系统说,就在当前目录找。

      当然除此以外还有另外一种方式去运行脚本:

      这种运行方式是,直接运行解释器,其参数就是 shell 脚本的文件名,如:

      /bin/bash hello.sh
      
      image-20200615142151341

    3.3 小练习

    • 在到/home目录下,创建一个aa.txt文件

      vim test1.sh
      

      文件内容如下:

      #!/bin/bash
      #进入home目录
      cd /home
      #创建文件
      touch aa.txt
      echo '执行成功'
      

      增加文件权限

       chmod +x test1.sh 
      

      执行脚本

      ./test1.sh
      
      image-20200615143300976

      注意,切换到root用户下执行,否则可能会有权限问题。

      查看执行结果:

      image-20200615143352435

      通过上述的练习我们可以知道,所谓的脚本就是将多个命令堆积到一块,然后去执行这个脚本。当然这只是shell基本写法,除了这个基本写法以外还有一些高级写法,接下来我们就来看看高级写法

    3.4 变量

    3.4.1 基本变量

    • 定义变量

      name='value'
      name="value"
      
      • 变量名只能由英文字母,数字和下划线组成,不能以数字开头。
      • 变量名中间不能有空格
      • 不能使用标点符号
      • 不能使用关键字(可以使用help指令查看关键字)
    • 使用变量

      your_name="hello"
      echo $your_name
      

      使用变量就在变量名前面加上美元符号即可

    • 案例

      #!/bin/bash
      #字符串需要加上单引号和双引号
      name="lisi"
      #数字可以不加不加
      num=1
      #boolean类型的数据也可以不加
      flag=true
      
      # 使用变量 $变量名
      echo $name
      echo $num
      echo $flag
      

      执行结果如下

      image-20200615145606780

      注意:

      双引号能够识别变量,且能够使用转义

      单引号不能够识别变量且不能够转移,只能原样输出。如下:

      #!/bin/bash
      num=123
      test1="hello$num"
      test2='hello$num'
      echo $test1
      echo $test2
      

      执行结果如下:

      image-20200615150340386
    • 定义变量,输入日期格式,格式为年:月:日 时:分:秒

      #!/bin/bash
      dt=`date  +'%F %T'`
      echo $dt
      

      命令的结果赋值给一个变量,需要加上反单引号

    3.4.2 只读变量

    使用 readonly命令可以将变量改为只读变量,只读变量不能够再去赋值,如下:

    #!/bin/bash
    name=lisi
    readonly name
    name=wangwu
    echo $name
    

    执行报错,从下图的错误显示看,name是一个只读变量

    image-20200615151434338

    3.4.3 删除变量

    使用unset删除变量

    #!/bin/bash
    name="lisi"
    age=15
    unset name
    echo $age
    echo $name
    

    执行可知

    image-20200615151755026

    如图,当把name变量删除后,打印出来的就只有空行了。

    3.4.4 接收用户输入

    使用read -p 提示信息 变量名去接收用户的参数

    #!/bin/bash
    read -p '请输入姓名' name
    echo  $name
    
    image-20200615152138949

    3.5 字符串操作

    3.5.1 拼接字符串

    • 单引号

      • 单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
      • 单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。
    • 双引号

      • 双引号里可以有变量
      • 双引号里可以出现转义字符
    • 案例

      • 拼接字符串

        #!/bin/bash
        name="lisi"
        #单引号拼接字符串
        desc='你的名字是'$name''
        
        #双引号拼接字符串
        desc2="你的名字是$name"
        
        echo $desc $desc2
        
        image-20200615153232497

    3.5.2 字符串长度

    #!/bin/bash
    name="lisi"
    #单引号拼接字符串
    desc='你的名字是'$name''
    
    #双引号拼接字符串
    desc2="你的名字是$name"
    
    echo $desc $desc2
    # 获取字符串长度
    echo ${#desc2}
    
    image-20200615153428743

    3.5.3 截取字符串

    #!/bin/bash
    name="lisi"
    #单引号拼接字符串
    desc='你的名字是'$name''
    
    #双引号拼接字符串
    desc2="你的名字是$name"
    
    echo $desc $desc2
    # 获取字符串长度
    echo ${#desc2}
    
    #从索引为2的位置开始连续截取4个字符,索引从0开始
    echo ${desc:2:4}
    
    image-20200615153921933

    3.6 数组

    3.6.1 简介

    bash 支持一维数组,不支持多维数组,与java一样,数组下标从0开始,数组大小没有限制,对数组里面的元素类型也没有限制

    3.6.2 定义数组

    • 语法1

      array_name=(value1 value2 ...);
      
    • 语法2

      array_name=(
        value1
        value2
        value3
        ...
      )
      
      array_name[0]=value0
      array_name[1]=value1
      ...
      

    3.6.3 获取数组值

    • 语法

      #获取数组特定元素
      ${array_name[index]}
      
      #获取数组所有元素
      ${array_name[@]}
      
    • 案例

      #!/bin/bash
      # 定义数组 里面的数组类型没有特定的显示
      array=(1 5 6 "lisi")
      
      # 打印数组里面所有的元素
      echo ${array[@]}
      
      # 打印数组下标为2的元素
      
      echo ${array[2]}
      
      
      echo "------------------------------------------------"
      
      #数组第二种方式
      arr=(
       true
       "lisi"
       1
       5
      )
      
      echo ${arr[1]}
      echo ${arr[@]}
      
      echo "---------------------------------------------"
      
      #数组的第三种方式
      arr2[0]=1
      arr2[1]=true
      arr2[2]="wangwu"
      
      echo ${arr2[@]}
      

      执行脚本

      image-20200615155525521

    3.6.4 数组长度

    #!/bin/bash
    array=(1 5 6 "lisi")
    
    length=${#array[@]}
    echo $length
    

    执行结果如下:

    image-20200615155803395

    3.7 注释

    • 单行注释

      #这是一个注释,到时候注释会被解释器忽略掉
      # 通过每一行加一个 # 号设置多行注释,像这样
      ##### tomcat start #####
      #
      #
      # tomcat config
      # 
      #
      ##### tomcat end  #####
      
    • 多行注释

      :<<EOF
      这是一个注释1
      这是一个注释2
      这是一个注释3
      ...
      EOF
      
      #!/bin/bash
      :<<EOF
      注释1
      注释2
      EOF
      array=(1 5 6 "lisi")
      
      length=${#array[@]}
      echo $length
      

      执行结果如下:

      image-20200615160345856

    相关文章

      网友评论

        本文标题:shell脚本编程快速入门(一)

        本文链接:https://www.haomeiwen.com/subject/ralcxktx.html