工具篇-shell脚本编程快速入门(一)

参考:《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  #####
    
  • 多行注释

    :<
    #!/bin/bash
    :<

    执行结果如下:

    image-20200615160345856

你可能感兴趣的:(工具篇-shell脚本编程快速入门(一))