shell 脚本案例之一键安装JDK

Posted 顧棟

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell 脚本案例之一键安装JDK相关的知识,希望对你有一定的参考价值。

Linux base shell 脚本案例 安装JDK(脚本可执行)

系统环境

Linux服务器,作者使用centos7操作系统,支持裸机安装JDK或者没有安装过JDK的用户安装JDK。

运行说明

  1. 拥有root用户使用权

  2. 将安装脚本和JDK安装包(tar.gz包)拷贝至服务器上。

  3. 通过root用户 执行脚本,例如:sh installJDK.sh gudong /opt/software

    脚本执行参数说明:

    1. 第一个参数是需要安装jdk的用户。–必填项
    2. 第二个参数是JDK安装包所在的目录(绝对地址)。–必填项
  4. 脚本提示安装成功之后,即可验证使用。安装详情,可在日志文件installJDK_log_$yyyy_mm_dd.log中找到。文件在脚本同级目录。

脚本分析

#!/bin/bash
# Author      : Donny
# History     :
# 2022/08/24    Version1   安装JDK(tar.gz)
# Program     : 在Centos7中实现JDK tar.gz的安装,仅仅支持裸机安装JDK,使用root用户执行脚本
#               root用户安装路径:/root/software
#               非root用户安装路径:/home/$jdkUser/software
#####################################################################################

# Incoming parameter area
# 安装jdk的用户
jdkUser=$1
# 安装包所在的地址路径(绝对路径)
sourcePath=$2

# Buildin function area
# >>>>>>>>>>>>>>>>>>>>>>>>>>>>>> 日志模块 >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
# 初始化日志模块
function initLogModule() 
    # 初始化日志输出
    logPath=$(pwd)
    # 脚本日志目录
    LogFile="$logPath/installJDK_log_$(date +%F).log"

    # 创建日志文件
    if ! [ -f "$LogFile" ]; then
        touch "$LogFile"
    fi

    echo "日志文件为: $LogFile"


# 输出红色高亮字体并标记ERROR
function echo_error() 
    echo -e "\\033[1;31m$1\\033[0m"
    [ -n "$LogFile" ] && echo "$(date +%F\\ %T,%N | cut -c1-23) [ERROR] $1" >>"$LogFile"


# 输出默认字体并标记INFO
function echo_info() 
    echo -e "$1"
    [ -n "$LogFile" ] && echo "$(date +%F\\ %T,%N | cut -c1-23) [INFO ] $1" >>"$LogFile"


# 输出绿色字体并标记INFO
function echo_green() 
    echo -e "\\033[32m$1\\033[0m"
    [ -n "$LogFile" ] && echo "$(date +%F\\ %T,%N | cut -c1-23) [INFO ] $1" >>"$LogFile"

# <<<<<<<<<<<<<<<<<<<<<<<<<<<<<< 日志模块 <<<<<<<<<<<<<<<<<<<<<<<<<<<<<<

# 验证执行环境
function vaildateEx() 

    current=$(whoami)
    # 0.用户检查
    if [[ "root" != "$current" ]]; then
        echo -e "\\033[1;31m请使用root用户执行脚本!\\033[0m"
        exit 1
    fi
    # 1.参数检查
    if [[ -z "$jdkUser" || -z "$sourcePath" ]]; then
        echo -e "\\033[1;31m请输入正确参数:
	第一个参数为安装jdk的用户,
	第二个参数为安装包所在的地址路径(绝对路径).
    例如: sh $0 root /opt \\033[0m"
        exit 1
    # 2.检查路径是否非法
    elif ! [ -d "$sourcePath" ]; then
        echo -e "\\033[1;31m安装包目录$sourcePath不存在\\033[0m"
        exit 1
    fi
    # 3.检查jdk安装包
    if jarTar=$(ls "$sourcePath"/*jdk-*.tar.gz); then
        count=$(echo "$jarTar" | wc -l)
        if [ "1" != "$count" ]; then
            echo_error "检查到有$count个安装包,请确认$sourcePath中只有一个JDK安装包!检测条件:*jdk-*.tar.gz"
            exit 1
        fi
    fi
    # 4.检查用户是否已安装java
    if [ "root" != "$jdkUser" ]; then
        # 执行返回值0代表java命令可以使用说明用户已经安装了JDK,若java命令不能执行则说明用户尚未安装jdk需要安装
        if sudo su - "$jdkUser" -c 'java -version >&/dev/null && exit 0 || exit 1'; then
            echo_error "$jdkUser用户已安装JDK。"
            exit 1
        fi
    else
        javaVersion=$(java -version 2>&1 | grep 'java version' | sed -e 's/"//g' | awk 'print $3')
        if [[ -n "$javaVersion" ]]; then
            echo_error "$jdkUser用户已安装JDK,版本$javaVersion。"
            exit 1
        fi
    fi
    echo_info "在用户$jdkUser下安装JDK,JDK安装包为$jarTar"
    if [ "root" != "$jdkUser" ]; then
        echo_info "安装目录: /home/$jdkUser/software"
    else
        echo_info "安装目录: /root/software"
    fi


# 创建jdk的安装用户
function createJdkUser() 
    if [ "root" != "$jdkUser" ]; then
        # 创建es用户和用户组
        if ! grep "^$jdkUser" /etc/group >&/dev/null; then
            groupadd "$jdkUser" -g 750
        fi

        if ! grep "^$jdkUser" /etc/passwd >&/dev/null; then
            useradd -g "$jdkUser" -u 750 es
        fi
    fi


# 非root用户安装JDK执行程序
function nonRootInstall() 
    # 创建用户软件安装目录
    mkdir -p /home/"$jdkUser"/software
    echo_info "开始解压$jarTar"
    tar -zxf "$jarTar" -C /home/"$jdkUser"/software/
    echo_info "解压完成,开始配置jdk环境变量"
    if ! jdkdPath=$(ls -d /home/"$jdkUser"/software/jdk*_*/); then
        echo_error "jdk安装包解压出来没有jdk文件夹!检测条件:jdk*_*"
        exit 1
    fi
    jdkdcount=$(echo "$jdkdPath" | wc -l)
    if [ "1" != "$jdkdcount" ]; then
        echo_error "检查到有$jdkdcount个jdk解压包,请确认/home/$jdkUser/software/中只有一个JDK安装包!检测条件:jdk*_*"
        exit 1
    fi
    jdkdPath=$jdkdPath::-1
    # 配置jdk环境变量
    ## 增加以下配置项
    sed -i '$a \\ ' /home/"$jdkUser"/.bashrc
    sed -i '$a # jdk configuration items' /home/"$jdkUser"/.bashrc
    sed -i '$a export JAVA_HOME='$jdkdPath'' /home/"$jdkUser"/.bashrc
    sed -i '$a export JRE_HOME=$JAVA_HOME/jre' /home/"$jdkUser"/.bashrc
    sed -i '$a export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH' /home/"$jdkUser"/.bashrc
    sed -i '$a export JAVA_PATH=$JAVA_HOME/bin:$JRE_HOME/bin' /home/"$jdkUser"/.bashrc
    sed -i '$a export PATH=$PATH:$JAVA_PATH' /home/"$jdkUser"/.bashrc
    # 确认用户权限
    chown -R "$jdkUser":"$jdkUser" /home/"$jdkUser/"
    ## 编译,让配置生效
    # shellcheck source=/dev/null
    if sudo su - "$jdkUser" -c 'java -version >&/dev/null && exit 0 || exit 1'; then
        echo_info "jdk环境变量配置完成"
    else
        echo_error "jdk环境变量配置失败"
        exit 1
    fi


# root用户安装JDK执行程序
function rootInstallJdk() 
    # 创建用户软件安装目录
    mkdir -p /root/software
    echo_info "开始解压$jarTar"
    tar -zxf "$jarTar" -C /root/software/
    echo_info "解压完成,开始配置jdk环境变量"

    if ! jdkdPath=$(ls -d /root/software/jdk*_*/); then
        echo_error "jdk安装包解压出来没有jdk文件夹!检测条件:jdk*_*"
        exit 1
    fi

    jdkdcount=$(echo "$jdkdPath" | wc -l)
    if [ "1" != "$jdkdcount" ]; then
        echo_error "检查到有$jdkdcount个jdk解压包,请确认/root/software/中只有一个JDK安装包!检测条件:jdk*_*"
        exit 1
    fi

    jdkdPath=$jdkdPath::-1
    ## 增加以下配置项
    sed -i '$a \\ ' ~/.bashrc
    sed -i '$a # jdk configuration items' ~/.bashrc
    sed -i '$a export JAVA_HOME='$jdkdPath'' ~/.bashrc
    sed -i '$a export JRE_HOME=$JAVA_HOME/jre' ~/.bashrc
    sed -i '$a export CLASSPATH=.:$JAVA_HOME/lib:$JRE_HOME/lib:$CLASSPATH' ~/.bashrc
    sed -i '$a export JAVA_PATH=$JAVA_HOME/bin:$JRE_HOME/bin' ~/.bashrc
    sed -i '$a export PATH=$PATH:$JAVA_PATH' ~/.bashrc

    echo_info "jdk环境变量生效"
    ## 编译,让配置生效
    # shellcheck source=/dev/null
    source ~/.bashrc
    javaVersion=$(java -version 2>&1 | grep 'java version' | sed -e 's/"//g' | awk 'print $3')
    if [[ -n "$javaVersion" ]]; then
        echo_green "jdk环境变量配置完成"
    else
        echo_error "jdk环境变量配置失败"
        exit 1
    fi


# Execute body area
# 日志初始化
initLogModule
echo_info "=================== 安装前检查begin ==================="
# 验证执行条件
vaildateEx
echo_green "=================== 安装前检查end   ==================="


echo_info "=================== 创建安装用户和用户组begin ==================="

if [ "root" != "$jdkUser" ]; then
    echo_info "非root用户,创建用户"
    createJdkUser
else
    echo_info "root用户,不创建用户"
fi

echo_green "=================== 创建安装用户和用户组end  ==================="


echo_info "=================== JDK 安装begin ==================="

if [ "root" != "$jdkUser" ]; then
    nonRootInstall
else
    rootInstallJdk
fi

echo_green "=================== JDK 安装end ==================="

echo_green "=================== 恭喜! JDK安装成功! ==================="
# Return value area
exit 0

以上是关于shell 脚本案例之一键安装JDK的主要内容,如果未能解决你的问题,请参考以下文章

shell 脚本之一键部署安装 Nginx

shell脚本之一键部署PXE远程安装服务,将解放双手进行到底!

常用的shell脚本之一键部署DNS服务正向解析

shell脚本之一键部署web服务器Nginx,日常解放双手!

shell脚本之一键部署yum本地源兼yum阿里源,再也不用为程序的下载安装烦扰!

shell脚本之一键部署zookeeper集群服务,能用脚本解决的事情,绝对不手敲。