記一次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的腳本中,上述操作是不會中止,運行符合預期的。
這個坑,隱蔽啊