“与”的区别是什么;否则,如果;及;以英语发言;在bash?

“与”的区别是什么;否则,如果;及;以英语发言;在bash?,bash,shell,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

我有以下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
我似乎无法使
elif[-e hcm.war]
在远程服务器上正常工作。远程服务器正在redhat上运行bash 3.2.25(如果这有什么区别的话)。我怀疑我只是缺少了一些挑剔的bash shell脚本细节


有什么建议吗?

您发布的代码似乎有效

elif。。fi
其他;如果。。。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

我希望这能有所帮助。

这并不是对这个问题的直接回答(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
    ...
也就是说,总是尝试副本,因为你总是想这样做,如果一个失败,尝试下一个,等等


另外,您总是希望将路径和字符串用引号括起来。否则,包含空格的路径将导致应用程序中断

你的意思是如果。。。伊里夫那么。。。在使用Fix/Copy>之前,请考虑在这里提出问题之前运行代码的习惯——有几个bug会被捕获。是的,您发布的代码是正确的解释。有时候,团队会想要部署
.ear
文件,但大多数时候,我们部署
.war
文件是为了测试。我没有
在我的代码中,所以我会尝试一下,看看它是否有区别。对不起,
如果;然后
在一行上,如果。。。然后,两行上的
实际上是相同的。我只是想收紧我的代码,这样你可以在1页上看到更多。谢谢你的chk分数!祝你好运。
[!${HCM\u}]
是个非常糟糕的主意。请记住,
[!]
等同于
[-n”!“]
——也就是说,如果没有其他参数,则
被视为我们正在测试的空/非空字符串。如果您打算提出所谓的最佳实践代码,可能应该是
[-z“$HCM_DEPLOYED”]
,或者
![-n“$HCM_部署”]
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
    ...