我回来了,这次接触的是Linux下的shell脚本。
前言
最近常常在Linux下启动一堆服务,每次重启电脑就得敲一堆命令,让我这个懒癌患者深受困扰!!基于不想把它们加入开机自启的前提,就开始动手写个Bash脚本将它们一键全部启动。
Bash
解释器
shell脚本首行需要有一个固定的格式,其意义表明使用对应解释器解析该脚本,常常有/bin/bash,/bin/sh等,这里我用的是bash:
常用语法
变量声明:name=
变量调用:$name
命令行参数获取:
1 2 3 4 5
| $0 # 命令行第一个变量 往往为脚本名称 $1 # 命令行第二个变量 $2 # 命令行第三个变量 $3 # 命令行第四个变量 $init # 命令行第init变量
|
多分支判断:
1 2 3 4 5 6 7 8
| case str in mode) command ;; mode) command ;; esac
|
编写思路
首先定义各个服务的工作目录设置成对应变量,使用分支判断调用不同功能:启动服务、杀死服务进程、修改服务配置等。
脚本编写
根据编写思路,需要使用到的命令大致分为:启动、杀进程(kill)、修改(seq)等。
启动
在不同的环境变量下,启动服务的命令不同。在这里我拿启动python为例。
1 2 3 4 5 6 7 8
| #!/bin/bash python=/usr/bin/python
case $1 in start) $python ;; esac
|
![shell-python.png]()
使用./shell.sh start来启动python
![shell-start.png]()
杀进程
Linux下使用kill命令即可杀进程,在这里我拿杀死启动的python为例。
1 2 3 4 5 6 7 8 9
| #!/bin/bash python=/usr/bin/python
case $1 in kill) pid_python=`ps -ef|grep $python|grep -v "$0"|grep -v "grep"|awk '{print $2}'` kill -9 $pid_python ;; esac
|
![shell-python2.png]()
使用./shell.sh kill来杀死python
![shell-kill.png]()
修改
需要对服务配置文件进行修改的时候,使用Linux的seq命令可以完成。
1 2 3 4 5 6 7 8
| #!/bin/bash config=/opt/config.cnf
case $1 in config) sed -i 's/port=.*/port=80/g' $config ; esac
|
![shell-change.png]()
使用./shell.sh config来修改config.cnf文件
![shell-config.png]()
总结
在编写bash脚本的时候,大部分问题都是由格式、编码等引起。
- 在Windows下编写,在Linux下使用,大概率会由换行符导致脚本无法运行:Windows下换行符为CRLF(正则表达式的\r\n,ASCII码的13和10),Unix(or Linux)下换行符为LF(正则表达式的\n)。这个问题会导致在Linux下运行\r\n为无效参数、vi等编辑器打开会出现^M、脚本头部出现乱码字符等;
- Linux Shell脚本单引号、双引号在使用时,具有不同效果:单引号为所见即所得、双引号为解析之后所得;
- seq命令在替换特殊字符时可以用\来转义(正则转义)。
完整代码
由于这个脚本涉及到一些机密的东西,完整代码不能上传到GitHub。望理解!