“与”的区别是什么;否则,如果;及;以英语发言;在bash?
我有以下shell脚本,它应该只是将一些Java.ear/.war文件转移到JBoss:“与”的区别是什么;否则,如果;及;以英语发言;在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
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
...