Shell map实现Docker简单部署脚本

#!/bin/bash

#声明一个命令帮助容器,运行脚本时输入的第一个参数当作命令,根据命令做不同处理
declare -A cmdHelpMap=()

redColor="\033[31m"
normalColor="\033[0m"
yellowColor="\033[33m"
scriptName=$0       #运行的脚本名字
inputArgsNum=$#     #运行脚本时输入参数的个数

#打印信息,对打印信息进行查找脚本名字,红色打印需要传递的参数
function println()
{
    findScriptName=0  #是否找到脚本名字
    index=0;

    #遍历打印信息
    for arg in $@
    do
        if [ ${arg} = ${scriptName} ]
        then
            findScriptName=1
            echo -en "\n\t"
        fi

        if [ ${index} -gt ${inputArgsNum} ]
        then
            echo -en ${redColor}
        fi
        echo -en "${arg} "

        if [ ${findScriptName} -eq 1 ]
        then
            let index++
        fi
    done
    echo -e ${normalColor}
}

#参数处理,判断输入参数个数与帮助信息中需要的参数个数是否相等,不相等则打印帮助信息并退出
function parameterHandling()
{
    findScriptName=0
    argsNum=0;

    key=$1
    helpMsg=${cmdHelpMap[$key]} 

    #遍历帮助信息总计需要输入的参数个数,帮助信息中出现脚本名字后开始统计,
    #自动以空格分割帮助信息进行遍历
    for msg in ${helpMsg}
    do
        if [ ${findScriptName} -eq 1 ]
        then
            let argsNum++
        fi

        if [ ${msg} = ${scriptName} ]
        then
            findScriptName=1
        fi
    done

    #参数个数不相等处理
    if [ ${inputArgsNum} -ne ${argsNum} ]
    then
        println ${helpMsg}
        exit
    fi
}

#确认操作
function confirm()
{
    echo -ne "${yellowColor}$* ?[y/n]${normalColor}"
    read input
    if [ -z ${input} ]
    then
        exit
    fi
    if [ ${input} != "y" ]
    then
        exit
    fi
}

#############################################################################################
#添加命令只需要两步:
#1、以命令为key,往cmdHelpMap中添加帮助信息
#2、以命令为函数名定义命令处理函数
#例如以下的help命令

#help命令
cmdHelpMap["help"]="查看帮助信息: ${scriptName} help"
function help()
{
    inputArgsNum=0
    println "Usage:"
    preFunc=${FUNCNAME[1]}
    number=1;
    for key in ${!cmdHelpMap[@]}
    do
        println ${number}.${cmdHelpMap[$key]}
        let number++
    done
}

#install命令
cmdHelpMap["install"]="安装docker: ${scriptName} install"
function install()
{
    docker -v
    if [ $? -eq 0 ]; then
        confirm Docker已安装,确认是否继续安装
    fi
    curl -sSL https://get.daocloud.io/docker | sh
}

#run命令
cmdHelpMap["run"]="运行容器: ${scriptName} run [imageName:imageTag] [hostPort:containerPort]"
function run()
{
    image=$2
    containerName=${image/:/-}
    port=$3
    docker run -d --name ${containerName} --restart=always -p ${port} ${image}
    if [ $? -ne 0 ]; then
        println ${redColor}运行${containerName}失败, 请检查镜像${image}是否存在
        exit
    fi
}

#rmi命令
cmdHelpMap["rmi"]="删除镜像: ${scriptName} rmi [imageName:imageTag]"
function rmi()
{
    image=$2
    confirm 确定删除镜像${image}

    docker rmi ${image}
    if [ $? -ne 0 ]; then
        println ${redColor}删除镜像失败, 请检查镜像${image}是否存在
    fi
}

#rm命令
cmdHelpMap["rm"]="删除容器: ${scriptName} rm [imageName-imageTag]"
function rm()
{
    containerName=$2
    docker rm -f ${containerName}
    if [ $? -ne 0 ]; then
        println ${redColor}删除容器失败, 请检查容器${containerName}是否存在
    fi
}

#############################################################################################

#如果第一个参数为空或者不存在map中,则默认第一个参数为help
cmd=$1
if [ -z $cmd ] || [ -z "${cmdHelpMap[$cmd]}" ]
then
    if [ $# -ne 0 ]
    then
        println ${redColor}无效参数:$*
    fi
    cmd="help"
    inputArgsNum=1
fi

#参数处理
parameterHandling $cmd

#执行相应处理函数
$cmd $*

效果图:
Shell map实现Docker简单部署脚本_第1张图片

你可能感兴趣的:(Shell map实现Docker简单部署脚本)