12 简单bash脚本

通过阅读本章,你将会了解到以下几项内容。

  • 理解脚本的概念
  • bash进行判断和简单数学计算
  • bash 的流程结构
  • 实现把UC视频缓存变为普通视频文件的脚本

12.1 何谓 shell 脚本

我认为就是最初的程序员一条条命令写得太累了,能不能把每行命令都放在一个文本文件里,让shell自己来读取呢,这样脚本就诞生了。囊括了命令、函数、变量等内容,实现一条命令完成众多工作的功能,可以复杂到启动系统,也可用简单到只有一条命令,类似 Windows 下的批处理文件。

12.1.1 执行和调试

由于 shell 脚本都是文本,可以用任意编辑器打开,可当做bashzsh等 shell 的参数来逐行直接执行,比如我们新建一个文本文件,内写上, uname -a,保存为myscript。可以通过如下方式执行,

$\$$ echo 'uname -a' > myscript
$\$$ bash myscript 
Linux litianci-PC 4.15.0-29deepin-generic $\#$31 SMP Fri Jul 27 07:12:08 UTC 2018 x86_64 GNU/Linux

解释

  1. 第1行,创建myscript文件。
  2. 第2行,执行该脚本文件
  3. 第3行,输出结果。

另外,也可用给脚本加上可执行权限,直接运行。通常在脚本第一行#!/bin/bash告诉 shell 使用 /bin/bash 执行该脚本。对于使用Python或者R语言等执行的脚本,相应的把/bin/bash换成相应的脚本解释器Python或者RScript等。

在 shell 脚本中,使用 # 表示单行注释,也就是从 # 到行尾的内容为注释内容。当然,有些#属于字符串的内容或者其他语法格式,不表示单行注释。如果你使用vim等编辑器打开脚本的时候,会发现注释的颜色是跟其他部分不一样的。通常在脚本第二行开始该脚本的功能注释,也可以添加作者、编辑信息等,然后另起一行注释该脚本的名称。空一行,开始脚本正文内容。如下面所示,

#!/bin/bash
# 本脚本实现 UC 浏览器视频缓存内容转换为一个完整的 MP4 文件
# ucvideo

if [! -e $2]
    echo "请按照如下格式调用该脚本"
fi

写完脚本,保存后,一般使用chmod u+x ucvideo的方式,给该脚本添加可执行权限。这样,可以像普通命令那样直接调用该脚本了。

$ ./ucvideo

当然,跟其他程序类似,脚本不可避免的要调试纠错,下面几种方法可能有用,

  • 注释掉某些内容,方法就是在行首加#
  • 使用 echo输出相关参数信息或者其他需要显示的内容。
  • 使用bash -x myscript,会输出每行命令及执行结果,对于循环或者分支判断语句,可以告诉你具体执行了那些内容。

当然,最主要的还是要做到代码整洁,及时给自己的代码注释,避免后面自己都忘记咋回事了。

12.1.2 shell 变量

为了存储一些输出结果,或者一些参数等,需要用到变量存储,方便脚本书写。对于内容偏大的临时结果,也可用使用文件存储。通常采用如下方式,

NAME=value

变量名NAME类似C语言的变量名规则,只可数字字母下划线,数字不可开头,区分大小写,中文不能出现在变量名中。对于变量值value则没有太多要求。通常是字符串、数字等,可以包含中文。比如,

HOME="中国"
e=2.7