Shell脚本撰写指南

属性信息
文档名称Shell脚本撰写指南
版本号V1.0.0.0

文档修改日志

修改时间修改人修改描述版本号
12-13 13:00宋全恒脚本撰写指南V0.0.0.0
12-17 17:00宋全恒添加描述压缩包的内容V0.0.0.1
12-19 15:51宋全恒添加流程控制与脚本内容V1.0.0.0

1 简介

Shell是一个命令解释器,它的作用是解释执行用户输入的命令及程序。用户每输入一条命令,Shell就执行一条。这种从键盘输入命令,就可以立即得到回应的对话形式,称为交互的方式。在JDK9引入的JShell,Python终端都是这样的交互程序。

2 压缩包

2.1 压缩包介绍

由于28所会统一考虑金蝶容器和war包的部署,因此在一键部署脚本执行的过程中,不包括应用管理平台程序和金蝶容器的部署。
在这里插入图片描述

2.2 压缩包文件资源目录

在这里插入图片描述
由于nginx和node源代码编译安装极为耗时,而且,在相同架构下的操作系统源代码安装的软件可以在相同架构下直接运行,因此在脚本执行过程中直接拷贝的是编译过后的文件。

2.3 注意事项

  • node/和nginx/由于在源代码编译时使用了—prefix=/opt/node和—prefix=/opt/nginx,因此两个编译后的目录必须位于/opt目录下。
  • nms/推流程序必须位于/opt目录下。
  • log4j.properties和search.yml配置文件位于/etc/search/目录下。而searchx.service位于/etc/systemd/system/目录下。并且在dpkg安装elasticsearch以及拷贝了search.service文件之后必须执行命令systemctl daemon-reload,不然有可能程序启动不了。
  • elastcisearch的日志目录和数据目录两个目录的所属用户和所属用户组必须均为elasticsearch和elasticsearch

3 脚本执行流程

在这里插入图片描述

4 常用命令

4.1 grep

grep [option] pattern filenames
-i, --ignore-case
       Ignore case distinctions in both the PATTERN and the input files.

-v, --invert-match
        Invert the sense of matching, to select non-matching lines.
Context Line Control
       -A NUM, --after-context=NUM
       -B NUM, --before-context=NUM
       -C NUM, -NUM, --context=NUM

逐行搜索指定的文件或标准输入,并显示匹配模式的每一行。
在这里插入图片描述
在这里插入图片描述

4.2 nohup

nohup的全称为no hang up,就是不挂断的意思。如果你正在运行一个进程,而且你觉得在推出账户时该进程还不会结束,那么可以使用nohup命令。该命令可以在退出账户/关闭终端之后继续运行相应的进程。
Nohup可以使得命令可以永久的执行下去,和用户终端没有关系,例如我们断开ssh连接都不会影响它的运行,注意了nohup没有后台运行的意思;&才是后台运行。
&指在后台运行,但当用户退出(挂起)的时候,命令自动也跟着退出。常用的实践为

nohup COMMAND &

这样就能使命令永久的在后台执行。

4.2.1 实践

cd /opt/AAS-V9.0/domains/mydomain;
nohup ../mydomain/bin/startapusic 1>nohup.out 2>&1 &

使用数据重定向技术把相关的日志打入bin目录下的nohup.out文件。
数据重定向可以将stanardout output和standard error output分别传送到其他的文件或设备区,分别使用如下的特殊字符。
在这里插入图片描述

4.2.2 >和>>

至于>与>>符号的区别参见如下:
在这里插入图片描述
至于最后一个&符号,主要作用是直接将命令丢到后台执行。

4.3 tar

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
并且tar在解压到指定目录的时候,若该目录下已经存在了对应的文件夹,解压会继续进行,不会提示的。

4.4 unzip

对于后缀为.zip的压缩包,解压到指定目录使用如下的命令即可:而且在解压到指定的目录时,该目录不存在命令会自动创建。

resource_file=./zhyqpt.zip
dest_dir=/opt
readonly dest_dir
install_base_dir=${dest_dir}/zhyqpt
readonly install_base_dir
unzip ${resource_file} -d ${install_base_dir}

4.5 cp

cp的命令为拷贝文件或者文件夹。
在这里插入图片描述
因此可以同时拷贝多个源文件到目的目录

-R, -r, --recursive
              copy directories recursively
-f, --force
              if an existing destination file cannot be opened, remove it and try again (this option is ignored when the -n option is also used)
-v, --verbose
              explain what is being done
search_dir=/etc/search
mkdir -p ${search_dir}
# 拷贝检索平台日志配置文件和程序配置文件
cp -v ${search_log_file} ${search_config_file} ${search_dir}

4.6 echo

echo的主要作用是
display a line of text
在这里插入图片描述
从上面可以看到-n的用法,添加-n选项之后不会打印尾部的换行。这可以从上图第二个示例看出。

4.6.1 输出命令的执行结果

可以使用echo直接输出命令执行的结果,但可能会差强人意。
在这里插入图片描述
注意,如果我们想要把命令执行的结果赋给一个变量可以采用两种形式。

  1. result=$(ps –ef | grep nginx)
  2. result=ps –ef | grep nginx

如果在脚本执行中想要获取格式优美的输出,以供进一步处理的话,可以采用如下的方式:
在这里插入图片描述

4.6.2 输出转义字符

可以使用-e输出转义字符,常用的转义字符”\t”表示制表符,即键盘上tab键。常用的转义字符如下:

关键字含义
\表示插入‘\’本身
\n换行
\r光标移动至行首,相当于使用“\r”后面的内容覆盖“\r”之前的内容。
\b退格符号,但前提是后面存在字符才会生效

在这里插入图片描述

4.6.3 写入文件

使用echo写入文件时要注意>和>>的区别。

>表示覆盖,>>表示追加。

参见>和>>

echo "bootstrap.memory_lock: false" >> "${es_config_file}"
echo "bootstrap.system_call_filter: false" >> "${es_config_file}"
echo "cluster.name: ${cluster_name}" >> "${es_config_file}"
echo "http.enabled: true" >> "${es_config_file}"
echo "http.port: 9200" >> "${es_config_file}"
echo "path.data: ${date_path}" >> "${es_config_file}"
echo "path.logs: ${log_path}" >> "${es_config_file}"
echo "transport.tcp.compress: true" >> "${es_config_file}"
echo "transport.tcp.port: 9300" >> "${es_config_file}"
echo "network.host: $yygl_ip" >> "${es_config_file}"

4.6.4 打印彩色字体

使用echo命令的-e选项,除了可以输出转义字符以外,还能够在命令行中输出彩色的字符,或者带有彩色背景的字符。
在这里插入图片描述
在实践中,我们可以把打印彩色字体或者背景色的内容封装成函数供我们调用,就很灵活了。

printGreenText() {
        echo -e  "\033[32m----$1----\033[0m"
}
printYellowText() {
        echo -e  "\033[33m----$1----\033[0m"
}

printRedText() {
        echo -e "\033[31m----$1----\033[0m"
}

printYellowBgGreenText() {
    echo -e  "\033[43;32m----你好----\033[0m"
}

对于如下的格式
在这里插入图片描述
常用的颜色总结如下
\033[31m和\033[0m这些代码叫做ANSI控制码。可以把\033[31m理解成开始输出红色字符,把\033[0m理解为结束输出红色字符。其实就是两种信号。

ANSI字体颜色代码含义
30黑色
31红色
32
33黄色
34蓝色
35紫色
36浅蓝色
37灰色

ANSI背景色代码如下:

ANSI背景色代码含义
40黑色
41红色
42绿色
43黄色
44蓝色
45紫色
46浅蓝色
47灰色

4.7 mkdir

用于创建目录

mkdir - make directories
-p, --parents
              no error if existing, make parent directories as needed
-v, --verbose
              print a message for each created directory
-m, --mode=MODE
              set file mode (as in chmod), not a=rwx - umask

-p参数用的较多,含义是递归的创建多个目录。
-m用于指定目录的访问权限。

echo -n "请输入elasticsearch数据存储目录,默认为(/var/elasticsearch/data):"
read date_path
if [ -z "${date_path}" ]; then
    date_path=/var/elasticsearch/data
fi
mkdir -p ${date_path}

4.8 rm

NAME
       rm - remove files or directories

SYNOPSIS
       rm [OPTION]... [FILE]...

DESCRIPTION
 -f, --force
       ignore nonexistent files and arguments, never prompt
-i     prompt before every removal
-I     prompt  once  before  removing  more  than three files,  or when removing recursively; less intrusive than -i, while still giving protection
              against most mistakes
-r, -R, --recursive
              remove directories and their contents recursively
-v, --verbose
              explain what is being done

在脚本撰写中较为常用的是-rfv

dest_dir=/opt
node_dir=${dest_dir}/node
nginx_dir=${dest_dir}/nginx
printGreenText "卸载node服务"
printGreenText "终止node服务"
kill -9 $(pgrep node)
rm -rfv ${node_dir}

4.9 head与tail

在这里插入图片描述

4.10 改变文件权限和属性

文件权限对于一个系统具有十分重要的作用,文件的权限对于使用者和群组对于LInux操作系统也起着十分重要的作用。chown和chmod是可以用来修改文件群组、拥有者、各种身份权限修改的指令。

注意:两个命令的执行需要超级管理员root权限。
在这里插入图片描述

4.10.1 chown

该命令为change owner的简写。

chown [-R] 文件或者目录
chown [-R] 账号名称:组名 文件或目录

实践

echo -n "请输入elasticsearch日志存储目录,默认为(/var/elasticsearch/logs):"
read log_path
if [ -z "${log_path}" ]; then
    log_path=/var/elasticsearch/logs
fi

mkdir -p ${log_path}
chown -R elasticsearch:elasticsearch ${log_path}

上述命令的执行就是把用户键入的日志目录的所属人和所属组都修改为elasticsearch账户和elasticsearch群组。该用户和群组是在dpkg -i elasticsearch-5.4.0.deb时创建的,这样es才可以正常的访问该目录进行数据的存户和日志的存储。

4.10.2 chmod

chmod用于改变文件的权限。

4.10.2.1 数字类型改变文件权限

Linux文件的基本权限有9个,分别是owner/group/others三种身份各有自己的read/write/execute.
文件的权限字符为[-rwxrwxrwx],这9个权限三个三个一组。我们也可以使用数字来代表各个权限

r:4
w:2
x:1

对于[-rwxrwx—]则表示

owner=rwx=4+2+1=7
group=rwx=4+2+1
others=---=0+0+0=0
chmod [-R] xyz 文件或目录

普通的文件的权限默认为644,文件夹755

4.10.2.2 符号类型改变文件权限

9个权限一共分为○1:user,○2:group,○3:others,可以使用u,g,o来代表这三种权限。使用a来代表all,亦即全部的身份。依然使用r、w、x代表可读、可写、可执行。
在这里插入图片描述
实践
在执行拷贝之后,可执行文件nginx的执行权限可能会被取消,因此可以使用如下的命令为nginx添加执行权限。

printYellowText "启动nginx服务"
cd ${nginx_dir}/sbin
chmod +x nginx

在这里插入图片描述
在这里插入图片描述

注意:u=rwx,go=rx中间没有空格。

4.11 进程管理

程序一般是放置在实体磁盘中,然后通过使用者的运行来触发。触发后会加载到内存中成为一个个体,那就是程序。为了操作系统可管理这个程序,因此程序有给予运行着的权限/属性等参数,并包括程序所需要的命令码与文件数据等,最后再给于一个PID。系统就是通过PID来进行进程管理的。
在这里插入图片描述

4.12 sed

sed是一个流式编辑器,输入一个文本文件的内容,sed通过命令可以对文基本进行详细的操作,包括
在这里插入图片描述
sed的从文件中每次读取一行内容到缓存(模式空间)中,处理完成后,再输出到屏幕,不会修改原始内容。存储到临时存储中的内容,除非使用了删除命令d和不打印临时去-n,所有内容都会输出到屏幕打印。
sed 流编辑器

-n 不打印匹配的内容。
-e script
		指定脚本命令
-e	script-file
		指定执行脚本文件。
-i 本地修改文件。

4.12.1 实践

在这里插入图片描述
在这里插入图片描述

# 删除每行前4个字符
sed 's/....//' filename
# 删除每行最后三个字符
sed 's/...$//' file

printGreenText "开始修改nginx配置"
nginx_config_file=${nginx_dir}/conf/nginx.conf
sed -i -e "s/upstream yygl.*$/upstream yygl {server ${yygl_ip}:8080;}/" -e "s/upstream fwgl.*$/upstream fwgl {server ${yygl_ip}:5000;}/" -e "s/upstream proxy1.*$/upstream proxy1 {server ${yygl_ip}:8091;}/" -e "s/upstream proxy2.*$/upstream proxy2 {server ${yygl_ip}:8092;}/" -e "s/upstream exwg.*$/upstream exwg {server ${exwg_ip}:10001;}/" ${nginx_config_file}

search_dir=/etc/search
mkdir -p ${search_dir}
# 拷贝检索平台日志配置文件和程序配置文件
cp -v ${search_log_file} ${search_config_file} ${search_dir}
sed -i "s/^.*es\.network:.*$/es\.network: ${yygl_ip}$/" ${search_dir}/search.yml

4.12.2 正则表达式

sed在文本替换时支持正则表达式,基本的正则表达式内容如下:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述在这里插入图片描述
在这里插入图片描述

5 Shell 语法

5.1 注意

在编写脚本时,有一些注意事项诸如函数和应用脚本的分离、Dash与Bash的配置等具体内容,需要注意。

5.1.1 指定解释器

另外,一个规范的Shell脚本在第一行会指出由那个解释器程序来执行脚本中的内容,常用的语句如下:

#! /bin/bash

5.1.2 脚本描述信息

Shell脚本开头会添加作者、版本、版权等信息

# Date: 2019-12-12 15:17
# Author: songquanheng
# Description: This script function is…
# version: v1.1

5.1.3 Dash与bash

由于Dash为银河麒麟脚本默认执行,但Dash支持的语法远不如bash,因此在脚本编写时先使用sudo dpkg-reconfigure dash来选择使用bash
bash有关键字function,dash没有关键字function,一律不使用function关键字函数
sh命令无法识别"[[]]"表达式
dash不支持数组,替代方法,采用变量名+序号来实现类似的效果
可以使用sudo dpkg-reconfigure dash选择否来使用bash,选择是来使用dash

sudo dpkg-reconfigure dash

在这里插入图片描述

5.1.4 导入脚本文件

由于shell脚本提供的能力远不如Java、C/C++强大,而且也不提供类型,在编写脚本时可能会出现一些通用的方法的定义,可以把此类方法放在辅助方法中,通过.号导入到当前脚本。
如下:

#!/bin/sh
# 导入功能函数
. ./util_function.sh

5.1.5 管道

终止8080端口的脚本如下:

kill -9 `netstat -anop | grep 8080 | awk  '{print $7}' | awk -F '/' '{print $1}'`

5.1.6 分号;

  1. 单行语句一般要用到分号来区分代码块。
    在这里插入图片描述
    第一个分号标识条件块结束,第二个分号标识then块结束。语句结尾不要分号。
  2. 代码若写作多行,用换行符来区分代码块。
    在这里插入图片描述

5.1.7 括号() {} []``

三个括号有不同的作用。

5.1.7.1 ()和``
5.1.7.1.1 命令执行符

在脚本编写的过程中,有可能需要保存一条命令的执行结果,此时可以使用()或者反引号。
在这里插入图片描述

5.1.7.1.2 数组作用符

另外,()也作为数组产生的作用符。参见数组

5.1.7.2 变量取值符{}

{}用于打印变量的值。
在这里插入图片描述
可以看到即使不加{},使用$variable也可以打印出变量的内容。

5.1.7.3 []
5.1.7.3.1 数组取元素符

在这里插入图片描述

5.1.7.3.2 判断符
contains() {
        result=$(echo $1 | grep "$2")
        if [ -n "${result}" ] ; then
                echo ${TRUE}
        else
                echo ${FALSE}
        fi
}

valid_ip() {
    domain_count=$(echo $1 | awk -F . '{print NF}')
    if [ ${domain_count} -ne 4 ]; then
        echo $FALSE
        exit 5
    fi
    ip=$1
    readonly ip
    ip_domains[0]=$(echo "${ip}" | awk -F . '{print $1}')
    ip_domains[1]=$(echo "${ip}" | awk -F . '{print $2}')
    ip_domains[2]=$(echo "${ip}" | awk -F . '{print $3}')
    ip_domains[3]=$(echo "${ip}" | awk -F . '{print $4}')

    for domain in ${ip_domains[@]}
    do
        if [ $(valid_ip_domain $domain) = ${FALSE} ]; then
            echo $FALSE
            exit 5
        fi
    done
    echo $TRUE
    exit 0
}

valid_ip_domain() {
    if [ $1 -ge 0 -a $1 -le 255 ]; then
        echo $TRUE
    else
        echo $FALSE
    fi 
}

需要注意:中括号的两端必须有空格才行

在这里插入图片描述

5.2 变量

变量与其他程序语言一样,用来存储一些设定或者一组数据。常用的设置形式如下:

aa=123
readonly bb=345
cc=”cetc52”

变量

5.3 判断

在任何程序语言中,判断逻辑都是十分基础的组成部分。通过判断结果来决定程序的走向。参见判断符。
在这里插入图片描述

5.3.1 if

if [ "$STATUS_MODE" = "HELP" ] ; then

    echo "Usage: install 应用管理ip 二型网管ip"
    exit
fi

5.3.2 if-elif

if [ "$1" = "-help" ] ; then
        STATUS_MODE="HELP"
elif [ "$1" = "--help" ] ; then
        STATUS_MODE="HELP"
elif [ "$1" = "help" ] ; then
        STATUS_MODE="HELP"
fi

5.3.3 case

在这里插入图片描述

5.3.4 test与[ ]

判断条件时,两者相当。

if [ ! -e ${es_config_file} ]; then
    printYellowText "es配置文件${es_config_file}不存在"
    touch ${es_config_file}
fi
echo -n "请输入elasticsearch集群名称: (默认为elasticsearch):"
read cluster_name
if [ -z "${cluster_name}" ]; then
        cluster_name=elasticsearch
fi

5.3.5 条件判断

5.3.5.1 文件类型判断

在这里插入图片描述

5.3.5.2 文件权限判断

在这里插入图片描述

5.3.5.3 整数的比较

在这里插入图片描述

5.3.5.4 字符串比较
5.3.5.4.1 判空与判等

在这里插入图片描述

5.3.5.4.2 字符串长度和子串

在这里插入图片描述

5.3.5.5 多重条件

在这里插入图片描述

5.3.5.5.1 实践
# 判断文件为有效的插件
isValidPlugin() {
    if test -f $1 -a $(contains $1 ".zip") = $TRUE ; then
        echo $TRUE
    else
        echo $FALSE
    fi
}
5.3.5.5.2 注意

在这里插入图片描述

5.4 循环

5.4.1 数组

与其他编程语言一样,Shell也支持数组。数组Array是若干数据的集合,其中每一份数据称为元素(Element)。
获取数组中元素要使用下标[],下标可以是一个整数,也可以是一个结果为整数的的表达式。下标大于等于0。Shell数组的长度不固定。

注意:Shell不支持多维数组。

  • 定义
array_name=(ele1 ele2 ele3… elen)
nums=(29 100 12 91 44)
# Shell是弱类型的
arr=(20 56 “http://c.biancheng.com”)
ages=([3]=24 [5]=19 [10]=12)
  • 读取
${array_name[index]}
# 使用@和*可以获取数组中的所有元素
${array_name[@]}
${array_name[*]}

动态定义数组变量,并使用命令的输出结果作为数组的内容。
在这里插入图片描述

  • 数组元素个数
    在这里插入图片描述
  • 数组打印
    – 使用下标
arr=(1 2 3 4 5)
for ((i=0; i<${#arr[@]}; i++)) 
do
echo $i ${arr[i]}
done

– 直接遍历元素

arr=(1 2 3 4 5)
for ele in ${arr[@]} 
do
echo ele
done

5.4.2 for循环

for循环用于重复整个对象列表,依次执行每一个独立对象的循环内容,对象可能是命令行参数、文件名、或是任何可以建立列表结构的东西。
在这里插入图片描述
在这里插入图片描述

5.4.3 while与until不定循环

# 只要condition是成功退出,while会继续执行
while condition
do
    statements
done

# 只要condition未成功退出,while会继续执行。
until condition
do
    statements
done

until要比while循环用的少,不过如果你要等待某件事发生时,它就有用了。
在这里插入图片描述

5.5 函数

函数指的是一段单独的程序代码,用以执行一些定义完整的单项工作,函数在使用之前必须先定义,这可通过在脚本的起始处定义,或者将它们放在一个独立的文件中以.点号命令来取用(source)他们。

valid_ip() {
    domain_count=$(echo $1 | awk -F . '{print NF}')
    if [ ${domain_count} -ne 4 ]; then
        echo $FALSE
        exit 5
    fi
    ip=$1
    readonly ip
    ip_domains[0]=$(echo "${ip}" | awk -F . '{print $1}')
    ip_domains[1]=$(echo "${ip}" | awk -F . '{print $2}')
    ip_domains[2]=$(echo "${ip}" | awk -F . '{print $3}')
    ip_domains[3]=$(echo "${ip}" | awk -F . '{print $4}')

    for domain in ${ip_domains[@]}
    do
        if [ $(valid_ip_domain $domain) = ${FALSE} ]; then
            echo $FALSE
            exit 5
        fi
    done
    echo $TRUE
    exit 0
}

valid_ip_domain() {
    if [ $1 -ge 0 -a $1 -le 255 ]; then
        echo $TRUE
    else
        echo $FALSE
    fi 
}

在这里插入图片描述

5.5.1 位置参数

在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

6 源码安装软件

6.1 流程

在这里插入图片描述

6.2 注意

在aarch64架构下编译的软件,可以直接运行在另一台相同aarch64架构的操作系统上。架构可以通过arch命令查看
在这里插入图片描述

7 脚本代码

7.1 util_function.sh

#!/bin/bash
TRUE="true" 
FALSE="false"
readonly TRUE
readonly FALSE

# 获取文件的绝对路径
absolutePath() {
        echo $(readlink -f "$1")
}

# 获取相对文件目录的绝对路径
absoluteDir() {
    cd "$1"
    echo $(pwd)
}

printGreenText() {
        echo -e  "\033[32m----$1----\033[0m"
}
printYellowText() {
        echo -e  "\033[33m----$1----\033[0m"
}

printRedText() {
        echo -e "\033[31m----$1----\033[0m"
}

printYellowBgGreenText() {
    echo -e  "\033[43;32m----你好----\033[0m"
}

contains() {
        result=$(echo $1 | grep "$2")
        if [ -n "${result}" ] ; then
                echo ${TRUE}
        else
                echo ${FALSE}
        fi
}

valid_ip() {
    domain_count=$(echo $1 | awk -F . '{print NF}')
    if [ ${domain_count} -ne 4 ]; then
        echo $FALSE
        exit 5
    fi
    ip=$1
    readonly ip
    ip_domains[0]=$(echo "${ip}" | awk -F . '{print $1}')
    ip_domains[1]=$(echo "${ip}" | awk -F . '{print $2}')
    ip_domains[2]=$(echo "${ip}" | awk -F . '{print $3}')
    ip_domains[3]=$(echo "${ip}" | awk -F . '{print $4}')

    for domain in ${ip_domains[@]}
    do
        if [ $(valid_ip_domain $domain) = ${FALSE} ]; then
            echo $FALSE
            exit 5
        fi
    done
    echo $TRUE
    exit 0
}

valid_ip_domain() {
    if [ $1 -ge 0 -a $1 -le 255 ]; then
        echo $TRUE
    else
        echo $FALSE
    fi 
}

trim() {
    : "${1#"${1%%[![:space:]]*}"}"
    : "${_%"${_##*[![:space:]]}"}"
    printf '%s\n'"$_"
}

7.2 install.sh

#!/bin/sh

# 导入功能函数
. ./util_function.sh

ES="elasticsearch"

# 判断是否为aarch64架构
isAarch64() {
    if [ ! "aarch64" = $(arch) ];then
    echo -n "不为aarch64架构无法安装"
    exit 1
    fi  
}
isAarch64

# 判断文件为银河麒麟下可以使用dpkg安装的程序包
isDeb() {
    isSubStr=$(contains $1 ".deb")
    if [ -f $1 -a $isSubStr = $TRUE ]; then
            echo $TRUE
    else
            echo $FALSE
    fi

}

# 判断文件为有效的插件
isValidPlugin() {
    if test -f $1 -a $(contains $1 ".zip") = $TRUE ; then
        echo $TRUE
    else
        echo $FALSE
    fi
}

is_elasticsearch_installed() {
    status=$(dpkg -s "${ES}" | grep Status)
    echo $(contains "$status" "install")
}

if [ "$1" = "-help" ] ; then
        STATUS_MODE="HELP"
elif [ "$1" = "--help" ] ; then
        STATUS_MODE="HELP"
elif [ "$1" = "help" ] ; then
        STATUS_MODE="HELP"
fi

if [ "$STATUS_MODE" = "HELP" ] ; then

    echo "Usage: install 应用管理ip 二型网管ip"
    exit
fi

# 判断当前用户是否为root
printYellowText "当前用户${USER}"

if test ${USER} != "root" ;then
  printRedText "请切换成root用户进行elasticsearch与插件的安装" 
fi

paramCount=$#
if test $paramCount -lt 2 ; then
    printRedText "脚本运行时需要添加两个参数:应用管理ip 二型网管ip"
    exit 5
fi

if test $(valid_ip "$1") != $TRUE ;then 
    printRedText "请输入有效的应用管理ip"
    printYellowText "please input -help option to get some help"
    exit 5
fi

if test $(valid_ip "$2") != $TRUE ;then 
    printRedText "请输入有效的二型网管ip"
    printYellowText "please input -help option to get some help"
    exit 5
fi


yygl_ip=$1
exwg_ip=$2
readonly yygl_ip
readonly exwg_ip
printGreenText "ip验证成功"
printYellowText "解压安装资源"
resource_file=./zhyqpt.zip
dest_dir=/opt
readonly dest_dir
install_base_dir=${dest_dir}/zhyqpt
readonly install_base_dir
unzip ${resource_file} -d ${install_base_dir}

printYellowText "开始安装ElasticSearch"
printGreenText "安装根目录 ${install_base_dir}"
es_file=${install_base_dir}/search/elasticsearch-5.4.0.deb

printGreenText "开始安装elasticsearch服务"
if $(is_elasticsearch_installed) ; then
    printRedText "elasticsearch已经安装,无需进行安装"
    exit 1
else 
    dpkg -i "${es_file}"
fi
systemctl daemon-reload
printGreenText "安装elasticsearch服务成功"

printGreenText "开始配置elasticsearch服务"
es_config_file=/etc/elasticsearch/elasticsearch.yml

if [ ! -e ${es_config_file} ]; then
    printYellowText "es配置文件${es_config_file}不存在"
    touch ${es_config_file}
fi
echo -n "请输入elasticsearch集群名称: (默认为elasticsearch):"
read cluster_name
if [ -z "${cluster_name}" ]; then
        cluster_name=elasticsearch
fi

echo -n "请输入elasticsearch数据存储目录,默认为(/var/elasticsearch/data):"
read date_path
if [ -z "${date_path}" ]; then
    date_path=/var/elasticsearch/data
fi
mkdir -p ${date_path}
chown -R elasticsearch:elasticsearch ${date_path}
echo -n "请输入elasticsearch日志存储目录,默认为(/var/elasticsearch/logs):"
read log_path
if [ -z "${log_path}" ]; then
    log_path=/var/elasticsearch/logs
fi

mkdir -p ${log_path}
chown -R elasticsearch:elasticsearch ${log_path}

echo "bootstrap.memory_lock: false" >> "${es_config_file}"
echo "bootstrap.system_call_filter: false" >> "${es_config_file}"
echo "cluster.name: ${cluster_name}" >> "${es_config_file}"
echo "http.enabled: true" >> "${es_config_file}"
echo "http.port: 9200" >> "${es_config_file}"
echo "path.data: ${date_path}" >> "${es_config_file}"
echo "path.logs: ${log_path}" >> "${es_config_file}"
echo "transport.tcp.compress: true" >> "${es_config_file}"
echo "transport.tcp.port: 9300" >> "${es_config_file}"
echo "network.host: $yygl_ip" >> "${es_config_file}"
printGreenText "elasticsearch配置文件配置完成"


es_plugin_dir=/usr/share/elasticsearch/plugins
if [ ! -e ${es_plugin_dir} ]; then
    printYellowText "es插件目录${es_plugin_dir}不存在"
    mkdir -p ${es_plugin_dir}
fi
printYellowText "开始安装elasticsearch插件"
es_ik_plugin_file=${install_base_dir}/search/elasticsearch-analysis-ik-5.4.0.zip
es_image_plugin_file=${install_base_dir}/search/elasticsearch-image-script-1.0.1.zip
printYellowText "安装分词插件"
unzip ${es_ik_plugin_file} -d ${es_plugin_dir}
printYellowText "安装分词插件成功"

printYellowText "安装图片检索插件"
unzip ${es_image_plugin_file} -d ${es_plugin_dir}
printYellowText "安装图片索引插件"
printGreenText "安装elasticsearch插件成功"

printGreenText "部署检索平台程序"
search_program_dir=${install_base_dir}/search
search_file=${search_program_dir}/search.zip
search_config_file=${search_program_dir}/searchx.service
search_service_dir=/etc/systemd/system
mkdir -p /home/kylin/
search_home=/home/kylin/search
unzip ${search_file} -d ${search_home}


printYellowText "检索平台程序部署成功"
printYellowText "复制检索平台配置文件"
cp -v ${search_config_file} ${search_service_dir}
search_log_file=${search_program_dir}/log4j.properties
search_config_file=${search_program_dir}/search.yml

search_dir=/etc/search
mkdir -p ${search_dir}
# 拷贝检索平台日志配置文件和程序配置文件
cp -v ${search_log_file} ${search_config_file} ${search_dir}
sed -i "s/^.*es\.network:.*$/es\.network: ${yygl_ip}$/" ${search_dir}/search.yml
# 重新加载service
systemctl daemon-reload
printGreenText "完成检索平台程序部署"

printGreenText "开始页面程序部署"
printYellowText "开始安装node"
web_root_dir=${install_base_dir}/web

node_program_dir=${web_root_dir}/node
printGreenText "开始复制node服务"
cp -vr ${node_program_dir} ${dest_dir}

printYellowText "完成node的源码安装"

printYellowText "复制推流程序"
stram_program_file=${web_root_dir}/nms/
cp -vr ${stram_program_file} ${dest_dir}

printYellowText "开始安装nginx"
nginx_program_dir=${web_root_dir}/nginx
cp -vr ${nginx_program_dir} ${dest_dir}
nginx_dir=${dest_dir}/nginx
printGreenText "拷贝nginx配置文件"
cp -vf ${web_root_dir}/nginx.conf ${nginx_dir}/conf

printGreenText "开始修改nginx配置"
nginx_config_file=${nginx_dir}/conf/nginx.conf
sed -i -e "s/upstream yygl.*$/upstream yygl {server ${yygl_ip}:8080;}/" -e "s/upstream fwgl.*$/upstream fwgl {server ${yygl_ip}:5000;}/" -e "s/upstream proxy1.*$/upstream proxy1 {server ${yygl_ip}:8091;}/" -e "s/upstream proxy2.*$/upstream proxy2 {server ${yygl_ip}:8092;}/" -e "s/upstream exwg.*$/upstream exwg {server ${exwg_ip}:10001;}/" ${nginx_config_file}
printGreenText "开始启动服务"
printYellowText "启动es服务"
systemctl restart elasticsearch
printYellowText "启动searchx服务"
systemctl restart searchx
printYellowText "启动nginx服务"
cd ${nginx_dir}/sbin
chmod +x nginx

# 避免手动回车
str=$"\n"
nohup ./nginx >/dev/null 2>&1 & 
sstr=$(echo -e $str)
echo $sstr

printYellowText "启动推流服务"
node_dir=${dest_dir}/node
cd ${node_dir}/bin
chmod +x *
nohup ./node ${dest_dir}/nms/app.js >/dev/null 2>&1 &
sstr=$(echo -e $str)
echo $sstr
printYellowText "移除解压资源"
rm -rf ${install_base_dir}

printGreenText "完成服务的启动"

7.3 uninstall.sh

#!/bin/sh

# 导入功能函数
. ./util_function.sh

# 判断当前用户是否为root
printYellowText "当前用户${USER}"

if test ${USER} != "root" ;then
  printRedText "请切换成root用户进行elasticsearch与插件的安装" 
fi

printGreenText "卸载elasticsearch服务"
systemctl stop elasticsearch
dpkg --purge elasticsearch
systemctl daemon-reload
printGreenText "卸载检索平台程序"
systemctl stop searchx
rm -rfv /home/kylin/search
rm -rfv /etc/systemd/system/searchx.service
systemctl daemon-reload
rm -rfv /etc/search
dest_dir=/opt
node_dir=${dest_dir}/node
nginx_dir=${dest_dir}/nginx
printGreenText "卸载node服务"
printGreenText "终止node服务"
kill -9 $(pgrep node)
rm -rfv ${node_dir}
printGreenText "移除推流程序"
rm -rfv ${dest_dir}/nms
printGreenText "卸载nginx服务"
printGreenText "终止nginx服务"
kill -9 $(pgrep nginx)
rm -rfv ${nginx_dir}
printGreenText "删除资源文件"
rm -rfv ${dest_dir}/zhyqpt

printGreenText "智慧营区服务卸载成功"
																	2019-12-28 18:08 于马塍路36号
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值