2011-08-19 61 views
19

我已經得到了的應該只是階段性的幾個的Java的.ear/.war文件當中到JBoss下面的shell腳本:bash中的「else if」和「elif」有什麼區別?

SUCCESS=false 
DEPLOY_PATH=/apps/jboss/server/default/deploy 

E_NOARGS=75 
M_USAGE="usage: $0 {rcm|hcm}" 
M_MISSING_RCM="missing: rcm.war file not present" 
M_MISSING_HCM="missing: hcm.ear or hcm.war file not present" 

if [ -z "$1" ] 
then 
    echo $M_USAGE 
    exit $E_NOARGS 
else 
    M_START="deploying $1 ..." 
    M_FINISH="finished deploying $1" 
fi 

until [ -z "$1" ] 
do 
    echo $M_START 
    case "$1" in 
    rcm*) 
     # do a hot-deploy of the rcm.war file 
     # TODO: test if rcm.war file is present, error out if not 
     if [ -e rcm.war ] 
     then 
     cp -v rcm.war $DEPLOY_PATH/rcm.war 
     SUCCESS=true 
     else 
     echo $M_MISSING_RCM 
     fi 
     ;; 
    hcm*) 
     # do a shutdown, deploy hcm.war, and restart jboss 
     ps -ef | awk '/jboss/{print $2}' | xargs kill -s KILL 

     HCM_DEPLOYED=false 

     if [ -e hcm.ear ] 
     then 
     cp -v hcm.ear $DEPLOY_PATH/hcm.ear 
     HCM_DEPLOYED=true 
     else 
     if [ -e hcm.war ] 
     then 
      cp -v hcm.war $DEPLOY_PATH/hcm.war 
      HCM_DEPLOYED=true 
     else 
      echo $M_MISSING_HCM 
     fi 
     fi 

     if $HCM_DEPLOYED ; 
     then 
     # TODO: detect the hostname 
     nohup /apps/jboss/bin/run.sh -b <HOSTNAME> & &> /dev/null 
     SUCCESS=true 
     fi 
     ;; 
    *) 
     echo $M_USAGE 
     exit 1 
    esac 
    shift 
done 

if $SUCCESS ; 
then 
    echo $M_FINISH 
fi 

,混淆了我特別的部分是這個:

 if [ -e hcm.ear ] 
     then 
     cp -v hcm.ear $DEPLOY_PATH/hcm.ear 
     HCM_DEPLOYED=true 
     else 
     if [ -e hcm.war ] 
     then 
      cp -v hcm.war $DEPLOY_PATH/hcm.war 
      HCM_DEPLOYED=true 
     else 
      echo $M_MISSING_HCM 
     fi 
     fi 

我似乎無法讓elif [ -e hcm.war ]在遠程服務器上正常工作。遠程服務器在Redhat上運行bash 3.2.25(如果這有什麼不同)。我懷疑我只是缺少一些挑剔的bash shell腳本細節。

有什麼建議嗎?

+0

你是說你不能'如果那麼... elif然後... fi'工作? –

+0

是的,這就是我的意思。 – emptyset

+1

考慮通過http://shellcheck.net/製作一個運行代碼的習慣,然後在這裏提問 - 這裏有幾個bug。 –

回答

28

您的代碼發佈似乎工作。

elif .. fielse ; if ... fi之間的差異。一個真正的elif ... fi將比您的代碼少一個fi

您的代碼發佈後詢問「如果hcm.ear存在,則檢查是否有hcm.war」。那是你要的嗎?另一個要測試的邏輯路徑是「如果hcm.ear不存在,那麼檢查是否存在hcm.war」。

交替邏輯路徑看起來像

if [ -e hcm.ear ] ; then 
    cp -v hcm.ear $DEPLOY_PATH/hcm.ear 
    HCM_DEPLOYED=true 
    elif [ -e hcm.war ] ; then 
     cp -v hcm.war $DEPLOY_PATH/hcm.war 
     HCM_DEPLOYED=true 
    else 
    echo $M_MISSING_HCM 
    fi 

我希望這有助於。

+0

是的,你發佈的代碼是正確的解釋。有時候,團隊會想要部署'.ear'文件,但大多數情況下,我們正在部署'.war'文件用於測試目的。我沒有';'在我的代碼中,所以我會嘗試一下,看看它是否有所作爲。 – emptyset

+1

對不起,如果...;然後'在一行上,如果...則在兩行上真的是一樣的。我只想收緊我的代碼,以便在1頁上看到更多內容。感謝chk標記!祝你好運。 – shellter

2

這不是直接回答這個問題(ELIF VS人),但我會重構像這樣:

HCM_DEPLOYED=true 
cp -v hcm.ear "${DEPLOY_PATH}/" || cp -v hcm.war "${DEPLOY_PATH}/" || HCM_DEPLOYED=false 
if [ ! ${HCM_DEPLOYED} ]; then 
    echo "${M_MISSING_HCM}" 
else 
    # TODO: detect the hostname 
    ... 

即總是嘗試拷貝,因爲你總是想要做它們,如果一個失敗嘗試下一個,等等。

順便說一句,你總是希望用引號包裝路徑和字符串。否則,包含空格的路徑將導致您的應用程序中斷。

+0

'[! $ {HCM_DEPLOYED}]'是一個非常糟糕的主意。請記住'[! ]'相當於'[-n「!」 ]' - 也就是說,如果沒有其他參數,'!​​'被視爲我們正在測試空/非空的字符串。如果你打算提出所謂的最佳實踐代碼,也許它應該是'[-z「$ HCM_DEPLOYED」]或'! [-n「$ HCM_DEPLOYED」]'? –

相關問題