shell脚本初识

Linux系统上有两种文件可执行,一个就是可执行文件,另一个是shell脚本。

一、批量处理命令行

如果命令复杂需要几行,并且经常使用,那么每次敲不是很累吗?
如果能够把这些内容存在电脑上,每次需要用的时候直接调用,岂不快哉?
于是shell应运而生。
shell最简单的使用方法就是从中执行命令行

登录远程主机,进入之前的Demo目录,nano一个新文件,输入两行内容:

#!/bin/bash
echo `find . -name ‘*test*’`

第一行是一个莫名其妙的内容,什么意思?
如上所述shell其实是一种脚本语言,所以需要一个解释器,第一行就是告诉系统我要使用哪个解释器。bash是标准的shell解释器(也就是说还有别的解释器)
第二行开头是一个echo,在shell里表示打印到终端的意思,后面是上一节输入的命令,两边使用了“括起来,表示这是一条命令。(注意不是单引号,是键盘左上角那个符号)

于是这个简单的shell脚本的语义解释就是使用bash来运行某条命令,并把结果输出到终端。

我们来运行一下,但是运行前需要给这个文件加上可执行权限

然后执行,注意前面必须有./表示从当前目录下

成功!

二、作为脚本语言

shell最基础的用法就是命令行,这也是为什么在Linux上基本都用shell的原因:相性好
然而shell不止步于此,还可以作为一种简单的脚本语言使用
支持整形、字符串、数组,可以自定义函数等等
这些可以等有需要了随时学习,参考https://www.runoob.com/linux/linux-shell.html

三、案例:守护进程

比如下面的shell脚本可以作为守护进程使用。

#!/bin/bash

#check if certain process exists every 5 minutes. This is done by using the grep ps. If PID > 0 that process must exist.
#grep -v "XX" means excluding lines that contain "XX"
#awk command means split the line by space or tab and retrieve the first item
while true
do
    pid_val=`ps -x | grep MyProcess | grep -v "grep" | awk '{print $1}'`
    if [ $pid_val > 0 ]
    then
        sleep 300
    else
        `nohup ./MyProcess >/dev/null 2>&1 &`
    fi 
done

效果是每5分钟检查一下MyProcess是否存在,实现原理是ps -x获取当前用户进程,然后grep搜索关键字段。使用grep本身也算一个进程会出现在ps -x结果里,所以先把这个grep排除掉,然后如果进程存在则结果会是123 ttys 0.0 ./MyProcess之类的(固定格式,自己试一下ps -x即可)。awk把一行内容按空格分隔,那个$1返回第一项。
所以这一长串命令的最终效果是把MyProcess的PID提出出来。

如果PID存在则进程存在,休眠5分钟再检查一遍。如果PID不存在则进程挂了,执行一条命令重启进程(默认shell脚本与MyProcess在同一目录下,这条命令表示什么下篇文章说明)