shell--設置導致出錯問題

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

這個坑,隱蔽啊

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

發佈了92 篇原創文章 · 獲贊 26 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章