Quelle est la différence entre “else if” et “elif” en bash?
J'ai le script suivant qui est censé simplement le stade un peu de Java .oreille/.la guerre des fichiers de 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
La section en particulier qui me confond est celui-ci:
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
Je n'arrive pas à obtenir elif [ -e hcm.war ]
pour travailler correctement sur le serveur distant. Le serveur distant est en cours d'exécution bash 3.2.25 sur redhat (si cela fait une différence.) Je pense que je suis juste en manque quelques pointilleux bash script shell détail.
Des suggestions?
- Vous dites que vous ne pouvez pas obtenir
if then ... elif then ... fi
de travail? - Ouais, c'est ce que je voulais dire.
- Envisager de prendre l'habitude de code en cours d'exécution par le biais de shellcheck.net avant de poser des questions, ici, il y a plusieurs bugs il va prendre.
Vous devez vous connecter pour publier un commentaire.
Votre code affiché semble fonctionner.
Il y a une différence entre
elif .. fi
ETelse ; if ... fi
. Un vraielif ... fi
aura un de moinsfi
à la fin de votre code.Votre code posté, demande, "si hcm.l'oreille existe de vérifier ENSUITE si il y a un hcm.de la guerre". Est-ce que vous voulez? L'autre logique de chemin de tester serait "si hcm.l'oreille n'existe pas de vérifier ENSUITE si il y a une hcm.la guerre".
Qui alternent logique de chemin ressemble à
J'espère que cette aide.
.ear
fichier, mais la plupart du temps, nous sommes le déploiement de la.war
fichier à des fins de test. Je n'ai pas le;
dans mon code, je vais donc essayer cela et voir si cela fait une différence.if ... ; then
sur une ligne ETif ... then
sur 2 lignes sont vraiment les mêmes. J'aime juste pour serrer mon code de sorte que vous pouvez voir plus sur 1 page. Merci pour le chk marque! Bonne chance.Ce n'est pas une réponse directe à la question (elif vs autre) mais je tiens à refactoriser comme suit:
I. e. essayez toujours les copies depuis que vous avez toujours envie de les faire, si l'on échoue, essayez la prochaine, etc.
Que d'un côté, on a toujours envie d'envelopper les chemins et les chaînes de caractères entre guillemets. Sinon un chemin contenant des espaces à cause de votre application à la pause.
[ ! ${HCM_DEPLOYED} ]
est une très mauvaise idée. Gardez à l'esprit que[ ! ]
est équivalent à[ -n "!" ]
-- c'est, si il n'y a pas d'autres arguments, le!
est traité comme une chaîne que nous sommes en train de tester le vide / non-vide. Si vous êtes à la va proposer une prétendue meilleures pratiques de code, peut-être qu'il devrait être[ -z "$HCM_DEPLOYED" ]
, ou! [ -n "$HCM_DEPLOYED" ]
?