2011-08-19 29 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”]'? –

相关问题