工具篇-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  #####
    
  • 多行注释

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

    执行结果如下:

    image-20200615160345856
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
禁止转载,如需转载请通过简信或评论联系作者。
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容