Shell 脚本命令的工作方式有两种:交互式和批处理。
➢ 交互式(Interactive):用户每输入一条命令就立即执行。
➢ 批处理(Batch):由用户事先编写好一个完整的 Shell 脚本,Shell 会一次性执行脚本
中诸多的命令。
使用 Vim 编辑器把 Linux 命令按照顺序依次写入到一个文件中,这就是一个简单的脚本了。
例如,如果想查看当前所在工作路径并列出当前目录下所有的文件及属性信息,实现这
个功能的脚本应该类似于下面这样:
zoupeng@zoupeng-ThinkPad-X1-Carbon-5th:~$ vim example.sh
#!/bin/bash
#For example By linuxprobe.com
pwd
ls -al
Shell 脚本文件的名称可以任意,但为了避免被误以为是普通文件,建议将.sh 后缀加上,以表示是一个脚本文件。
在上面的这个 example.sh 脚本中实际上出现了三种不同的元素:
第一行的脚本声明(#!)用来告诉系统使用哪种 Shell 解释器来执行该脚本;
第二行的注释信息(#)是对脚本功能和某些命令的介绍信息,使得自己或他人在日后看到这个脚本内容时,可以快速知道该脚本的作用或一些警告信息;
第三、四行的可执行语句也就是我们平时执行的 Linux 命令了。
来执行一下看看结果:
zoupeng@zoupeng-ThinkPad-X1-Carbon-5th:~$ bash example.sh
/home/zoupeng
total 599132
drwxr-xr-x 28 zoupeng zoupeng 4096 Jun 7 15:29 .
drwxr-xr-x 3 root root 4096 Jun 7 10:16 ..
-rw-r--r-- 1 zoupeng zoupeng 587202560 Jun 5 18:26 560_file
-rw------- 1 zoupeng zoupeng 23254 Jun 7 14:07 .bash_history
-rw-r--r-- 1 zoupeng zoupeng 220 Nov 17 2018 .bash_logout
其实,Linux 系统中的 Shell 脚本语言已经内设了用于接收参数的变量,变量之间可以使用空格间隔。例如$ 0对应的是当前Shell 脚本程序的名称,$#对应的是总共有几个参数, $*对应的是所有位置的参数值, $?对应的是显示上一次命令的执行返回值,而$1、$2、$3…则分别对应着第 N 个位置的参数值,如图所示。
尝试编写一个脚本程序示例,通过引用上面的变量参数来看下真实效果:
zoupeng@zoupeng-ThinkPad-X1-Carbon-5th:~$ vim example.sh
#!/bin/bash
echo "当前脚本名称为$0"
echo "总共有$#个参数,分别是$*。"
echo "第一个参数为$1, 第5个为$5。"
zoupeng@zoupeng-ThinkPad-X1-Carbon-5th:~$ sh example.sh one two three four five six
当前脚本名称为example.sh
总共有6个参数,分别是one two three four five six。
第一个参数为one, 第5个为five。
Shell 脚本中的条件测试语法可以判断表达式是否成立,若条件成立则返回数字 0,否则便返回其他随机数值。条件测试语法的执行格式如图所示。切记,条件表达式两边均应有一个空格。
按照测试对象来划分,条件测试语句可以分为 4 种:
➢ 文件测试语句;
➢ 逻辑测试语句;
➢ 整数值比较语句;
➢ 字符串比较语句。
文件测试即使用指定条件来判断文件是否存在或权限是否满足等情况的运算符,具体的参数
如表所示。
运算符 | 作用 |
---|---|
-d | 测试文件是否为目录类型 |
-e | 测试文件是否存在 |
-f | 判断是否为一般文件 |
-r | 测试当前用户是否有权限读取 |
-w | 测试当前用户是否有权限写入 |
-x | 测试当前用户是否有权限执行 |
下面使用文件测试语句来判断/etc/fstab 是否为一个目录类型的文件,然后通过 Shell 解释器的内设$?变量显示上一条命令执行后的返回值。如果返回值为 0,则目录存在;如果返回值为非零的值,则意味着目录不存在:
zoupeng@zoupeng-ThinkPad-X1-Carbon-5th:~$ [ -d /etc/fstab ]
zoupeng@zoupeng-ThinkPad-X1-Carbon-5th:~$ echo $?
1
再使用文件测试语句来判断/etc/fstab 是否为一般文件,如果返回值为 0,则代表文件存在,且为一般文件:
zoupeng@zoupeng-ThinkPad-X1-Carbon-5th:~$ [ -f /etc/fstab ]
zoupeng@zoupeng-ThinkPad-X1-Carbon-5th:~$ echo $?
0
逻辑语句用于对测试结果进行逻辑分析,根据测试结果可实现不同的效果。例如在 Shell终端中逻辑“与”的运算符号是&&,它表示当前面的命令执行成功后才会执行它后面的命令,因此可以用来判断/dev/cdrom 文件是否存在,若存在则输出 Exist 字样。
zoupeng@zoupeng-ThinkPad-X1-Carbon-5th:~$ [ -e /etc/fstab ] && echo "Exist"
Exist
除了逻辑“与”外,还有逻辑“或”,它在 Linux 系统中的运算符号为||,表示当前面的命令执行失败后才会执行它后面的命令,因此可以用来结合系统环境变量 USER 来判断当前登录的用户是否为非管理员身份:
zoupeng@zoupeng-ThinkPad-X1-Carbon-5th:~$ [ $USER = zoupeng ] || echo "user"
zoupeng@zoupeng-ThinkPad-X1-Carbon-5th:~$ [ $USER = root ] || echo "user"
user
第三种逻辑语句是“非”,在 Linux 系统中的运算符号是一个叹号(!),它表示把条件测试中的判断结果取相反值。也就是说,如果原本测试的结果是正确的,则将其变成错误的;原本测试错误的结果则将其变成正确的。
zoupeng@zoupeng-ThinkPad-X1-Carbon-5th:~$ [ ! $USER = zoupeng ] || echo "administartor"
administartor
可用的整数比较运算符如表所示:
运算符 | 作用 |
---|---|
-eq | 是否等于 |
-ne | 是否不等于 |
-gt | 是否大于 |
-lt | 是否小于 |
-le | 是否等于或小于 |
-ge | 是否大于或等于 |
zoupeng@zoupeng-ThinkPad-X1-Carbon-5th:~$ echo $?
1
zoupeng@zoupeng-ThinkPad-X1-Carbon-5th:~$ [ 10 -eq 10 ]
zoupeng@zoupeng-ThinkPad-X1-Carbon-5th:~$ echo $?
0
接下来先使用 free -m 命令查看内存使用量情况(单位为 MB),然后通过 grep Mem:命令过滤
出剩余内存量的行,再用 awk '{print $4}'命令只保留第四列,最后用 FreeMem=语句
的方式把语句内执行的结果赋值给变量。
zoupeng@zoupeng-ThinkPad-X1-Carbon-5th:~$ free -m
total used free shared buff/cache available
Mem: 7739 1708 3783 364 2247 5392
Swap: 3773 0 3773
zoupeng@zoupeng-ThinkPad-X1-Carbon-5th:~$ free -m | grep Mem:
Mem: 7739 1708 3781 366 2250 5390
zoupeng@zoupeng-ThinkPad-X1-Carbon-5th:~$ free -m | grep Mem: | awk '{print $4}'
3819
zoupeng@zoupeng-ThinkPad-X1-Carbon-5th:~$ FreeMen=`free -m | grep Mem: | awk '{print $4}'`
zoupeng@zoupeng-ThinkPad-X1-Carbon-5th:~$ echo $FreeMen
3819
字符串比较语句用于判断测试字符串是否为空值,或两个字符串是否相同。它经常用来判断某个变量是否未被定义(即内容为空值)。字符串比较中常见的运算符如表所示。
运算符 | 作用 |
---|---|
= | 比较字符串内容是否相同 |
!= | 比较字符串内容是否不同 |
-z | 判断字符串内容是否为空 |
接下来通过判断 String 变量是否为空值,进而判断是否定义了这个变量:
zoupeng@zoupeng-ThinkPad-X1-Carbon-5th:~$ [ -z $String ]
zoupeng@zoupeng-ThinkPad-X1-Carbon-5th:~$ echo $?
0
当用于保存当前语系的环境变量值 LANG 不是英语(en.US)时,则会满足逻辑测试条件并输出“Not en.US”(非英语)的字样:
zoupeng@zoupeng-ThinkPad-X1-Carbon-5th:~$ [ $LANG != "en.US" ] && echo "Not en.US"
Not en.US