记一次shell的诡异出错问题
实现功能:对/etc/profile文件内关键配置内容进行查找,如果存在,则不变化,如果不存在,则插入。(其实就是环境变量的设置)
function value_check()
{
vnr=`grep "$1" /etc/profile`
if [ ! -n "$vnr" ]
then
sed -i '$a\export '$1'' /etc/profile
fi
}
function jdk_install()
{
cd /opt/ds
mkdir -p /usr/local/jdk
tar -zxvf jdk-8u131-linux-x64.tar.gz -C /usr/local/jdk/
nr="JAVA_HOME=/usr/local/jdk/jdk1.8.0_131"
value_check "$nr"
nr='CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar'
value_check "$nr"
nr='PATH=$JAVA_HOME/bin:$PATH'
value_check "$nr"
}
就这样两个函数,但是运行的时候,问题出在了vnr=`grep "$1" /etc/profile`这一句上,在这一句的时候就退出了,后面的内容就不执行,甚是诡异。
问题解决尝试操作:
- 在终端上将shell命令执行一遍,可以,是预期结果,没有报错
- 在脚本中将各变量打印出来看,到grep前的变量值都是正确的,没有问题
- 新建一个脚本,重新写这两个函数实现,也可以
- 将新建脚本内容复制到原shell中,问题依旧
我一度怀疑这个文件有问题。。。
在不经意间,我看到了在脚本最前面的一个sehll设置,set -e。。。我感觉,问题就在这里了,一验证,果不其然
现在做一下原理推测:
Set -e的作用是在shell脚本执行出错误的时候,中止脚本的继续向下执行,
在使用grep语句查询,并把结果赋值给变量,在这其中,可能是查询为空,或者是将空值赋值给变量这两个操作,被认为是错误的,因此,程序中止退出,并没有任何报错
在没有设置set -e的脚本中,上述操作是不会中止,运行符合预期的。
这个坑,隐蔽啊