记一次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`这一句上,在这一句的时候就退出了,后面的内容就不执行,甚是诡异。

问题解决尝试操作:

  1. 在终端上将shell命令执行一遍,可以,是预期结果,没有报错
  2. 在脚本中将各变量打印出来看,到grep前的变量值都是正确的,没有问题
  3. 新建一个脚本,重新写这两个函数实现,也可以
  4. 将新建脚本内容复制到原shell中,问题依旧

我一度怀疑这个文件有问题。。。

 

在不经意间,我看到了在脚本最前面的一个sehll设置,set -e。。。我感觉,问题就在这里了,一验证,果不其然

 

现在做一下原理推测:

Set -e的作用是在shell脚本执行出错误的时候,中止脚本的继续向下执行,

在使用grep语句查询,并把结果赋值给变量,在这其中,可能是查询为空,或者是将空值赋值给变量这两个操作,被认为是错误的,因此,程序中止退出,并没有任何报错

 

在没有设置set -e的脚本中,上述操作是不会中止,运行符合预期的。

这个坑,隐蔽啊