关于shell脚本与运维相关的知识

笔者曾经见到一个复杂的自动部署脚本,这里特别记录一下,以便对它有更深的理解。
脚本大致流程:

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 “

” --menu “ [ ] . . .

#!/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]:string1string2,;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/

  1. 进行上传解压安装操作
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
}
  1. 进行重启服务器相关操作;
RESTART_SERVICE () {
/etc/init.d/php-fpm restart
/etc/init.d/mysql restart
}

UPDATE_CLOUD () {
echo "NONE"
exit 0
}

  1. 控制程序流程
case $CHOICE in
1)
	INSTSLL_PKG
	ChECK_CONF
	RESTART_SERVICE
*)
	echo "Please Input 1 2 or 3"
	;;	
esac
	

关于这个install.sh

是每个版本单独的部署,思路与上面类似,也是先关掉服务, 复制文件,安装库,删除文件类的命令,然后重启服务类的
shell脚本中安装库的命令是 rpm

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值