Shell脚本文件以.sh作为后缀名,在脚本的第一行一般都是“#!/bin/bash”,这是一行特殊的脚本声明,表示后面的语句通过/bin/bash程序来解释执行。
以#开头的语句表示注释信息。
条件语句
单分支的if语句:
if [条件测试语句] //条件测试语句返回值为0则表示条件成立,若返回值不为0则跳过then
then
需要执行的命令
fi
双分支的if语句
if [条件测试语句]
then
需要执行的命令
else
需要执行的命令
fi
多分支的if语句
if [条件测试语句]
then
需要执行的命令
elif [条件测试语句]
then
需要执行的命令
else
需要执行的命令
fi
case语句
case "$变量名" in
变量值1)
需要执行的命令
;;
变量值2)
需要执行的命令
;;
*) //*表示可匹配任意值,若找不到任何匹配的值则执行默认模式“*)”
需要执行的命令
esac
例1:
一、编写名为demo的服务脚本(以启动、停止、重启sleep进程为例,在实际中可换成其他的服务进程)
[root@localhost ~]# vi demo
#!/bin/bash
case "$1" in
start) //启动进程
echo "正在启动sleep服务..."
if sleep 7200 & //默认情况下,进程都是属于前台进程,若要设置进程为后台进程,则在启动参数后面加 &
then
echo "OK"
fi
;;
stop) //杀死进程
echo "正在停止sleep服务..."
kill "sleep" &> /dev/null //"&>"表示将正常执行时的信息和出现错误时的错误提示信息保存在空文件/dev/null中。">"是覆盖原文件, ">>"是在原文件上追加内容。
echo "OK"
;;
status) //判断并提示进程状态
if grep "sleep"
then
echo "sleep服务已经启动"
else
echo "sleep服务已经停止"
fi
;;
restart)//重启服务,先停止再启动
$0 stop //$0是预定义变量,会输出当前执行的脚本的名称
$0 start
;;
*)
echo "用法:$0 {start|stop|status|restart}"
esac
[root@localhost ~]#chmod +x demo //添加可执行权限
二.、执行demo脚本
[root@localhost ~]# ./demo start
正在启动sleep服务...OK
[root@localhost ~]# ./demo stop
正在停止sleep服务...OK
[root@localhost ~]# ./demo status
sleep服务已经停止
[root@localhost ~]# ./demo reload
用法:./demo {start|stop|status|restart}
循环语句
for 变量名 in 取值列表
do
需要执行的命令
done
while [条件测试语句]
do
需要执行的命令
done
例2
一、编写脚本
[root@localhost ~]#vi name.txt //取值列表文件
Tom
Pat
Tim
[root@localhost ~]#vi chkname.sh
#!/bin/bash
HLIST=$(cat name.txt) //需正确填写name.txt文件所在路径;cat命令用于连接、显示文件内容
for NAME in $HLIST
do
echo "The name is $NAME"
done
[root@localhost ~]#chmod +x demo.sh
二、执行脚本
[root@localhost ~]# ./demo.sh
The name is Tom
The name is Pat
The name is Tim
预定义变量
在脚本中以下的变量是预先定义好的特殊变量,在脚本中使用代表了特殊的意义。
$#:表示命令行中执行的命令的位置的个数
例如:
[root@localhost ~]# ./bak.sh /root/local /etc/init.d
则$#表示(输出)2$*:表示命令行中执行的命令的位置的内容
例如:
[root@localhost ~]# ./bak.sh /root/local /etc/init.d
则$*表示(输出)/root/local /etc/init.d$?:表示前一条命令执行后的返回状态,返回值为0表示执行正确,返回值为非0则表示执行出现异常
$0:表示当前执行脚本的名称
例如:
[root@localhost ~]# ./bak.sh /root/local /etc/init.d
则$0表示(输出)./bak.sh
脚本中使用exit
在脚本中执行的命令体的最后加上exit 0 则表示程序正常执行并退出,若加上exit 1 则表示程序出现异常并退出;在使用echo $? 命令时会返回exit的值。
《Linux网络服务与Shell脚本攻略》 肖睿 著-