在工作中,需要涉及到安装环境变量,如果机器太多就会导致花费大量的时间在配置环境上,如果有一个脚本,只需要把我们需要的安装包放在指定位置等待安装即可就可以减轻工作压力,因此本文意在减轻jdk环境变量的安装问题
注意事项:
1、jdk安装包,默认放在/root目录下面
2、java的安装目录在/usr/local/java/下
3、run.sh和check_jdk.sh 需要放在同一目录下
run.sh
#!/bin/bash
bashrc="/root/.bashrc"
profile="/etc/profile"
jdktarget="/usr/local/java"
jdkpath="/root/jdk*"
jdkfile=`find "${jdkpath%/*}" -name "jdk*" 2>&1`
jdkcreate=0
# 判断jdk的安装目录是否存在
if [ ! -d "$jdktarget" ]; then
echo "不存在$jdktarget文件,即将开始创建.."
mkdir "$jdktarget"
echo "$jdktarget文件创建完成"
jdkcreate=1
else
read -p "是否覆盖jdk原文件(y/n)" -t 30 condition
if [ ! -n "$condition" ]; then
a=1
elif [[ "$condition" -eq "y" ]] || [[ "$condition" == "Y" ]]; then
echo "存在jdk文件夹,清空$jdktarget文件并重新创建"
rm -rf $jdktarget/
mkdir "$jdktarget"
jdkcreate=1
fi
fi
# 判断root文件下是否含有jdk文件夹
if [ ! -d "$jdkpath" ]; then
existjdk=`find "$jdktarget/" -name "jdk1.8*" 2>&1`
if [ ! -n "$existjdk" ];then
echo "开始解压${jdkfile##*/}文件"
tar -zxf "/root/${jdkfile##*/}" -C $jdktarget
echo "解压完成"
else
echo "已经安装${existjdk##*/}"
fi
else
echo "不存在jdk文件,强制退出"
exit 0
fi
#写入java环境变量并立刻生效
if [ $jdkcreate == 1 ]; then
echo "开始添加jdk环境变量"
echo "搜所之前的环境"
length=`cat $profile | grep -n "JAVA_JDK" | grep -Po "\d+" | xargs -n2 | wc -l 2>&1 `
#可能存在一行,但是使空的一行
words=`cat $profile | grep -n "JAVA_JDK" | grep -Po "\d+" | xargs -n2 | wc -w 2>&1 `
if [ $words == 0 ];then
echo "$profile没有搜索到,开始加入新的java环境变量"
jdkrealpath=`find ${jdktarget%/*} -name "jdk1.8*"`
echo '#----------JAVA_JDK--------------------' >> $profile
echo "export JAVA_HOME="$jdkrealpath"" >> $profile
echo 'export PATH=$JAVA_HOME/bin:$PATH' >> $profile
echo 'export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar' >> $profile
echo '#----------JAVA_JDK--------------------' >> $profile
else
echo "$profile存在添加的JAVA环境变量,重新导入"
for (( i=1; i<=$length; i=i+1));do
#获取匹配到配置信息的首行和末尾
java_line_a=`cat $profile | grep -n "JAVA_JDK" | grep -Po "\d+" | xargs -n2 | awk 'NR==1{print $1}' 2>&1`
java_line_b=`cat $profile | grep -n "JAVA_JDK" | grep -Po "\d+" | xargs -n2 | awk 'NR==1{print $2}' 2>&1`
#执行删除操作 带上-i否则不会原地删除
sed -i ${java_line_a}","${java_line_b}"d" $profile
done
jdkrealpath=`find ${jdktarget%/*} -name "jdk1.8*"`
echo '#----------JAVA_JDK--------------------' >> $profile
echo "export JAVA_HOME="$jdkrealpath"" >> $profile
echo 'export PATH=$JAVA_HOME/bin:$PATH' >> $profile
echo 'export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar' >> $profile
echo '#----------JAVA_JDK--------------------' >> $profile
fi
echo "$profile环境变量导入成功..."
length=`cat $profile | grep -n "JAVA_JDK" | grep -Po "\d+" | xargs -n2 | wc -l 2>&1 `
#可能存在一行,但是使空的一行
words=`cat $bashrc | grep -n "JAVA_JDK" | grep -Po "\d+" | xargs -n2 | wc -w 2>&1`
if [ $words == 0 ];then
echo "$bashrc没有搜索到,开始加入新的java环境变量"
echo '#----------JAVA_JDK--------------------' >> $bashrc
echo "JAVA_HOME="$jdkrealpath"" >> $bashrc
echo 'PATH=$PATH:$JAVA_HOME/bin' >> $bashrc
echo '#----------JAVA_JDK--------------------' >> $bashrc
echo "$bashrc添加成功..."
else
echo "$bashrc存在添加的JAVA环境变量,重新导入"
for (( i=1; i<=$length; i=i+1));do
#获取匹配到配置信息的首行和末尾
java_line_a=`cat $bashrc | grep -n "JAVA_JDK" | grep -Po "\d+" | xargs -n2 | awk 'NR==1{print $1}' 2>&1`
java_line_b=`cat $bashrc | grep -n "JAVA_JDK" | grep -Po "\d+" | xargs -n2 | awk 'NR==1{print $2}' 2>&1`
#执行删除操作 带上-i否则不会原地删除
sed -i "${java_line_a},${java_line_b}d" $bashrc
done
echo '#----------JAVA_JDK--------------------' >> $bashrc
echo "JAVA_HOME="$jdkrealpath"" >> $bashrc
echo 'PATH=$PATH:$JAVA_HOME/bin' >> $bashrc
echo '#----------JAVA_JDK--------------------' >> $bashrc
fi
echo "$bashrc导入新的环境变量成功..."
# 使环境变量生效
. $profile
. $bashrc
fi
#指定查看java -version版本的脚本,注意不能直接在当前shell脚本查看
jdkresult=`./check_jdk.sh`
if [ $jdkresult == 0 ];then
exit 2
fi
check_jdk.sh
#!/bin/bash
function jdk()
{
check_results=`java -version 2>&1`
if [[ $check_results =~ "1.8." ]];then
java -version
echo "jdk安装完成"
return 1
else
echo "jdk安装失败!"
return 0
fi
}
echo $(jdk)
run.sh 是帮助我们直接安装的脚本,而check_jdk.sh则是检查java -version是否安装成功。因为想在一个shell脚本中使当前s追加到环境变量中的配置生效,必须使当前shell脚本退出以后才可以生效,因此我采用打开新的一个shell,在里面执行检查操作。
效果: