shell脚本编程
#!/bin/bash
#varibles
nginx_install_doc=/application/nginx
proc=nginx
nginxd=$nginx_install_doc/sbin/nginx
pid_file=$nginx_install_doc/logs/nginx.pid
#source function library 调用函数库
if [ -f /etc/init.d/functions ];then
. /etc/init.d/functions
else
echo "not found file /etc/init.d/functions"
exit
fi
#判断pid进程号,以及对应的进程数量是多少
if [ -f $pid_file ];then
nginx_process_id=`cat $pid_file`
nginx_process_num=`ps -aux|grep $nginx_process_id|grep -v "grep"|wc -l`
#除去grep那一条的进程,其余的进程数量
fi
#function
start () {
if [ -f $pid_file ]&&[ $nginx_process_num -ge 1 ];then #如果pid文件存在并且进程数量大于等于1,则nginx已经启动,不需要再启动
echo "nginx running..."
else
if [ -f $pid_file ]&& [ $nginx_process_num -lt 1 ];then #如果pid文件存在,但是进程数量小于1,则没有nginx这个进程,需要删除pid文件,并启动nginx
rm -f $pid_file
echo "nginx start `daemon $nginxd`" #第一种启动的写法
#action "nginx start" daemon $nginxd #第二种启动的写法
fi
echo "nginx start `daemon $nginxd`"
fi
}
stop () {
if [ -f $pid_file ]&&[ $nginx_process_num -ge 1 ];then
action "nginx stop" killall -s QUIT $proc #QUIT是结束进程时会等待该进程的请求执行完,stop是不管是否有请求,直接关闭该进程。
rm -f $pid_file
else
action "nginx stop" killall -s QUIT $proc 2>/dev/null
fi
}
restart (){
stop
sleep 1
start
}
reload (){
if [ -f $pid_file ]&&[ $nginx_process_num -ge 1 ];then
action "nginx reload " killall -s HUP $proc #如果想要更改配置而不需停止并重新启动服务
else
action "nginx reload " killall -s HUP $proc 2>/dev/null
fi
}
status (){
if [ -f $pid_file ]&&[ $nginx_process_num -ge 1 ];then
echo "nginx is running..."
else
echo "nginx is stop..."
fi
}
#callable
case $1 in
start) start;;
stop) stop;;
restart) restart;;
reload) reload;;
status) status;;
*) echo "usage: $0 start|stop|restart|reload|status"
esac
书写一个shell脚本
#bash解释器
#!/bin/bash 或者 #!/user/bin/env bash
#Author:Chang Xiaolong
#Created Time:2020/07/18 15:08
#Script Description:first shell script
bash -x script.sh #-x表示debug模式,会输出调试信息
运行一个shell脚本
- 给运行脚本一个执行该权限
- 使用解释器执行脚本 bash xxx.sh
shell重定向
> 重定向输入,覆盖原数据
>> 重定向追加输入,在原数据末尾追加
< 重定向输出 wc -l < /etc/passwd
<< 重定向追加输出 fdisk /dev/sdb << EOF .......EOF
read命令
-p 打印信息
-t 限定时间
-s 不显示
-n 输入字符个数
shell特殊变量
$0 脚本的名字
$* 脚本的参数
$# 传参数量
$$ 脚本进程号
$_ 最后执行的命令
函数语法
函数名(){
代码块
return N
}
function 函数名{
代码块
return N
}
正则表达式
特殊字符
^ 锚定开头
$ 锚定结尾
同时使用表示精确匹配,单一使用表示模糊匹配
shell对文件的操作
#""和''d 的做作用是一样
sed -i 's/原目标字符串/替换后的字符串/g' test.txt
#将home替换成admin
find -type f -name '*.mk' | xargs sed -i "s/home/admin/g"
sed -i 's:原目标字符串:替换后的字符串:g' test.txt
#将路径/home/admin/替换成$HOME_PATH
find -type f -name '*.mk' | xargs sed -i "s:/home/admin:\$\(HOME_PATH\):g"
-
sed命令
sed是Linux提供的外部命令,是一个行(流)编译器,非交互式的对文件进行增删改查操作。
文本编译器(vim):对象是整个文件;
行编译器:对象是文件中给一行;
sed有两种替换修改文件的方式 -
awk命令