编写Shell脚本
Shell 脚本命令的工作方式有下面两种
➢交互式 :用户每输入一条命令就立即执行
➢批处理:由用户事先编写好一个完整的 Shell 脚本,Shell 会一次性执行脚本中诸多的命令.
编写简单脚本
当前系统已经默认使用 Bash 作为命令行终端解释器了
echo $SHELL
如果想查看当前所在工作路径并列出当前目录下所有的文件及属性信息,实现这个功能的脚本应该类似于下面这样:
vim example.sh
bash example.sh
除了上面用 Bash 解释器命令直接运行 Shell 脚本文件外,第二种运行脚本程序的方法是通过输入完整路径的方式来执行。但默认会因为权限不足而提示报错信息,此时只需要为脚本文件增加执行权限即可。
./example.sh
chmod u+x example.sh
./example.sh
接收用户的参数
当用户执行某一个命令时,加或不加参数的输出结果是不同的:
wc -l anaconda-ks.cfg
wc -c anaconda-ks.cfg
wu -w anaconda-ks.cfg
已经内设了用于接收参数的变量,变量之间使用空格间隔。例如,$0 对应的是当前 Shell 脚本程序的名称,$#对应的是总共有几个参数,$*对应的是所有位置的参数值,$?对应的是显示上一次命令的执行返回值,而$1、$2、$3……则分别对应着第 N 个位置的参数值,如图所示。
vim example.sh
#!/bin/bash
echo "当前脚本名称为$0"
echo "总共有$#个参数,分别是$*。"
echo "第 1 个参数为$1,第 5 个为$5。"
bash example.sh one two three four five six
输出
当前脚本名称为 example.sh
总共有 6 个参数,分别是 one two three four five six。
第 1 个参数为 one,第 5 个为 five。
判断用户的参数
按照测试对象来划分,条件测试语句可以分为 4 种:
➢ 文件测试语句;
➢ 逻辑测试语句;
➢ 整数值比较语句;
➢ 字符串比较语句。文件测试即使用指定条件来判断文件是否存在或权限是否满足等情况的运算符,具体的参数如表所示。
下面使用文件测试语句来判断/etc/fstab 是否为一个目录类型的文件,然后通过 Shell 解释器的内设$?变量显示上一条命令执行后的返回值。如果返回值为 0,则目录存在;如果返回值为非零的值,则意味着它不是目录,或这个目录不存在:
[ -d /etc/fstab ]
echo $?
再使用文件测试语句来判断/etc/fstab 是否为一般文件,如果返回值为 0,则代表文件存在,且为一般文件:
[ -f /etc/fstab ]
echo $?
逻辑语句用于对测试结果进行逻辑分析,根据测试结果可实现不同的效果。例如在 Shell终端中逻辑“与”的运算符号是&&,它表示当前面的命令执行成功后才会执行它后面的命令,因此可以用来判断/dev/cdrom 文件是否存在,若存在则输出 Exist 字样
[ -e /dev/cdrom ] && echo "Exist"
除了逻辑“与”外,还有逻辑“或”,它在 Linux 系统中的运算符号为||,表示当前面的命令执行失败后才会执行它后面的命令,因此可以用来结合系统环境变量 USER 来判断当前登录的用户是否为非管理员身份:
echo $USER
[ $USER = root ] || echo "user"
su - linuxprobe
第三种逻辑语句是“非”,在 Linux 系统中的运算符号是一个叹号(!),它表示把条件测试中的判断结果取相反值。也就是说,如果原本测试的结果是正确的,则将其变成错误的;原本测试错误的结果,则将其变成正确的。
我们现在切换回到 root 管理员身份,再判断当前用户是否为一个非管理员的用户。由于判断结果因为两次否定而变成正确,因此会正常地输出预设信息:
exit
[ ! $user = root ] || echo "administrator"
叹号应该放到判断语句的前面,代表对整个的测试语句进行取反值操作,而不应该写成“$USER != root”,因为“!=”代表的是不等于符号(≠),尽管执行效果一样,但缺少了逻辑关系,这一点还请多加注意。
当前我们正在登录的即为管理员用户—root。下面这个示例的执行顺序是,先判断当前登录用户的 USER 变量名称是否等于 root,然后用逻辑“非”运算符进行取反操作,效果就变成了判断当前登录的用户是否为非管理员用户。最后若条件成立,则会根据逻辑“与”运算符输出 user 字样;若条件不满足,则会通过逻辑“或”运算符输出 root 字样,而只有在前面的&&不成立时才会执行后面的||符号。
[ ! $USER = root ] && echo "user" || echo "root"
整数比较运算符仅是对数字的操作,不能将数字与字符串、文件等内容一起操作,而且不能想当然地使用日常生活中的等号、大于号、小于号等来判断。因为等号与赋值命令符冲突,大于号和小于号分别与输出重定向命令符和输入重定向命令符冲突。因此一定要使用规范的整数比较运算符来进行操作。可用的整数比较运算符如表所示。
[ 10 -gt 10 ]
echo $?
[ 10 -eq 10 ]
echo $?
free 命令,它能够用来获取当前系统正在使用及可用的内存量信息。接下来先使用 free -m 命令查看内存使用量情况(单位为 MB),然后通过“grep Mem:”命令过滤出剩余内存量的行,再用 awk '{print $4}'命令只保留第 4 列。
free -m
free -m | grep Mem:
free -m | grep Mem: | awk '{print $4}'
如果想把这个命令写入到 Shell 脚本中,那么建议把输出结果赋值给一个变量,以方便其他命令进行调用:
FreeMen=`free -m | grep Mem: | awk '{print $4}'`
echo $FreeMen
我们使用整数运算符来判断内存可用量的值是否小于 1024,若小于则会提示“Insufficient Memory”(内存不足)的字样:
[ $FreeMen -lt 1024 ] && echo "Insufficient Memory"
字符串比较语句用于判断测试字符串是否为空值,或两个字符串是否相同。它经常用来判断某个变量是否未被定义(即内容为空值),理解起来也比较简单。字符串比较中常见的运算符如表所示。
接下来通过判断 String 变量是否为空值,进而判断是否定义了这个变量:
[ -z $String ]
echo $?
再次尝试引入逻辑运算符来试一下。当用于保存当前语系的环境变量值 LANG 不是英语(en.US)时,则会满足逻辑测试条件并输出“Not en.US”(非英语)的字样:
echo $LANG
[ ! $LANG = "en.US" ] && echo "Not en.US"