笔者曾经见到一个复杂的自动部署脚本,这里特别记录一下,以便对它有更深的理解。
脚本大致流程:
1. 输出选项(要安装项目的选项)
例如:
cat << EOF
1.Install CC-Project.
2. ...
3. ...
EOF
read -p "Input your choic:" CHOICE
cat命令:Linux下通常用于读取,显示或拼接文件内容(英文为:concatenate)。它主要有三大功能——1,一次显示整个文件,如 $ cat filename ; 2,从键盘创建一个新文件 $ cat > filename ;3,将几个文件合并为一个文件 $ cat file1 file2 > file
EOF在这里没有特殊的含义,在这里可以把EOF替换成其他东西,意思是把内容当作标准输入传给程序。
cat << EOF > test.sh 其实就等同于 cat test.sh (test.sh的内容就是cat生成的内容,即可以传值到脚本中去)
read命令:
cat配合read命令就可从标准输入中读取数值并存入变量CHOICE中.
用法: 1. 从输入中读取n个字符并存入变成variable_name
$ read -n number_of_chars variable_name
2. 无回显的方式读取密码
$ read -s var
3.显示提示信息
$ read -p “Enter input:” var
类似cat的命令还有 echo命令,在shell编程中极为常见,在终端下打印变量value的时候也是常常用到的,它的功能就是在显示器商显示一段文件,一般起到一个提示的作用。
whiptail命令
类似实现上面功能的还有一个命令: whiptail (做类似菜单交互式选择的功能)
用法:whiptail --title “
#!/bin/bash
OPTION=$(whiptail --title "Menu Dialog" --menu "Choose your favorite programming language." 15 60 4 "1" "python" "2" "Java" "3" "C" "4" "PHP" 3>&1 1>&2 2>&3)
exitstatus = $?
if [ $exitstatus = 0 ]; then
echo "Your favorite programming language is:" $OPTION
else
echo "You chose Cancel."
fi
2. 判断文件目录存在否与是否安装 scp工具
if [! -d /home/package];then
mkdir -p /home/package
fi
#1.检查安装scp工具 epel-realsease 第三方库源 ;
if which scp &>/dev/null;then
echo "scp is already install"
else
yum install epel-release -y &> /dev/null
yum install openssh openssh-clients-y &> /dev/null
fi
关于shell脚本中的 "-e,-d,-f"后接文件名称为文件表达式
-e filename :如果filename存在,则为真; -d filename:如果为目录,则为真
-f filename :如果为常规文件,则为真; -L filename:如果为符号链接则为真
-r filename: 如果filename可读,则为真; 类似的有"-w" , “x”
-s filename:如果文件长度不为0,则为真
整数变量表达式 -eq 等于; -ne 不等于; -gt 大于; -lt 小于; -le 小于等于
字符串变量表达式 if [$a =
b
]
:
表
示
如
果
s
t
r
i
n
g
1
等
于
s
t
r
i
n
g
2
,
则
为
真
;
i
f
[
b]: 表示如果string1等于string2,则为真; if [
b]:表示如果string1等于string2,则为真;if[a != $b]:如果两个字符串不相等则为真;
if [ -n $string ] 如果string 非空(非0),返回0(true)
if [ -z $string ] 如果string 为空,则为真
if [ $sting ] 如果string 非空,返回0 (和-n类似)
逻辑非 ! ; 逻辑与 -a (条件表达式的并列); 逻辑或 -o
例如 if [表达式1 -o 表达式2]
which命令:用于查找并显示给定命令的绝对路径,环境变量$PATH 中保存了查找命令时需要遍历的目录.
用法: which [选项] 命令
&标准流: 是一个指向标准流的指针,如果没有 & ,就是创建一个普通的文件句柄.
>&标准流: 是指将某个文件重定向到另一个流.
Linux的标准输入输出流只有三种,即 0 -stdin , 1 - stdout , 2 -stderr
若是其他数字则表示普通文件.
命令之后加上 “&” ,表示把该命令以后台方式执行.
>/dev/null:这条命令的作用就是将输出结果重定向到/dev/null中. /dev/null代表Linux的空设备文件,所有往这个文件里面写入的内容都会丢失.
3. 检查与修改系统配置 ,服务器配置文件检查及修改
#!/bin/bash
# 此处一般封装一个方法
ChECK_CONF(){
# Nginx 配置文件
NGINX_CONF=/usr/local/nginx/conf/nginx.conf
# 2. 检查时区,将时区改为东8区
ZONEINFO =`date -R | awk -F'' '{print $6}'`
if ["$ZONEINFO" !="+0800"];then
\cp -a /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
fi
#修改net.ipv4.tcp_max_tw_buckets的值
if grep 'net.ipv4.tcp_max_tw_buckets' /etc/sysctl.conf;then
sed -i '/net.ipv4.tcp_max_tw_buckets/d' /etc/sysctl.conf
echo "net.ipv4.tcp_max_tw_buckets = 25000" >> /etc/sysctl.conf
else
echo "net.ipv4.tcp_max_tw_buckets = 25000" >> /etc/sysctl.conf
fi
/sbin/sysctl -p &>/dev/null
}
awk命令: 就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理.
awk工作流程是这样的:读入有"\n"换行符分割的一条记录,然后将记录按指定的域分隔符分割,填充域,$0 则表示所有域,
1
表
示
第
一
个
域
,
1表示第一个域,
1表示第一个域,n表示第n个域.
-F:该参数表示指定分隔符
-f : 调用脚本
-v : 定义变量
’ { }’ :匹配命令代码块,包含一条或多条命令
grep命令
常用格式为:grep [选项] ”模式“ [文件]
模式就是类似基于正则表达式
常用选项:
- E :开启扩展(Extend) 的正则表达式.
- i : 忽略大小写.
- v : 反过来(invert),只打印没有匹配的,而匹配的反而不打印
- w : 被匹配的文本只能是单词
sed命令: 可以对文本文件进行增,删,改,查等操作,支持按行,按字段,按正则匹配文本内容,灵活方便.
sed -i :直接对内容进行修改,不加-i 时默认只是预览,不会对文件做实际修改.(插入)
sed -a : 追加 向匹配行后面插入内容
sed -c : 更改 向匹配行前插入内容
sed -s : 替换 替换掉匹配的内容
sed -d : 删除 删除匹配的内容
sed -i "s/old/new/
- 进行上传解压安装操作
PKG = (V1.0.10 V1.0.11 v1.0.12)
INSTSLL_PKG(){
scp -P 9000 root@ 111.111.111.111:/home/package/1.0/v1.[0-2]*-BIN.tar.gz /home/package
for | in ${PKG[*]};do
cd /home/package
tar -xf $|-BIN.tar.gz
cd $|/BIN
./install.sh
echo"***INSTALL***"
sleep 2
done
}
- 进行重启服务器相关操作;
RESTART_SERVICE () {
/etc/init.d/php-fpm restart
/etc/init.d/mysql restart
}
UPDATE_CLOUD () {
echo "NONE"
exit 0
}
- 控制程序流程
case $CHOICE in
1)
INSTSLL_PKG
ChECK_CONF
RESTART_SERVICE
*)
echo "Please Input 1 2 or 3"
;;
esac
关于这个install.sh
是每个版本单独的部署,思路与上面类似,也是先关掉服务, 复制文件,安装库,删除文件类的命令,然后重启服务类的
shell脚本中安装库的命令是 rpm