Linux-Bash(一)

我回来了,这次接触的是Linux下的shell脚本。

前言

最近常常在Linux下启动一堆服务,每次重启电脑就得敲一堆命令,让我这个懒癌患者深受困扰!!基于不想把它们加入开机自启的前提,就开始动手写个Bash脚本将它们一键全部启动。

Bash

解释器

shell脚本首行需要有一个固定的格式,其意义表明使用对应解释器解析该脚本,常常有/bin/bash,/bin/sh等,这里我用的是bash:

1
#!/bin/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脚本的时候,大部分问题都是由格式、编码等引起。

  1. 在Windows下编写,在Linux下使用,大概率会由换行符导致脚本无法运行:Windows下换行符为CRLF(正则表达式的\r\n,ASCII码的13和10),Unix(or Linux)下换行符为LF(正则表达式的\n)。这个问题会导致在Linux下运行\r\n为无效参数、vi等编辑器打开会出现^M、脚本头部出现乱码字符等;
  2. Linux Shell脚本单引号、双引号在使用时,具有不同效果:单引号为所见即所得、双引号为解析之后所得;
  3. seq命令在替换特殊字符时可以用\来转义(正则转义)。

完整代码

由于这个脚本涉及到一些机密的东西,完整代码不能上传到GitHub。望理解!