bash中“else if”和“elif”有什么区别?

时间:2011-08-19 19:59:52

标签: bash shell

我有以下shell脚本,它应该简单地将一些Java .ear / .war文件存放到JBoss:

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脚本细节。

有什么建议吗?

2 个答案:

答案 0 :(得分:36)

您发布的代码似乎有用。

elif .. fielse ; if ... fi之间存在差异。真正的elif ... fi最终会比您的代码少fi个。{/ p>

您的代码已发布,请求“如果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

我希望这会有所帮助。

答案 1 :(得分:2)

这不是问题的直接答案(elif vs else),但我会像这样重构:

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
    ...

即。总是尝试复制,因为你总是想要这样做,如果一个失败尝试下一个,等等。

顺便说一句,你总是想用引号括起路径和字符串。否则,包含空格的路径将导致您的应用中断。