J'ai le if
bloc suivant dans mon script bash:
if [ ${PACKAGENAME} -eq kakadu-v6_4-00902C ]; then
echo "successfully entered if block!!"
fi
L'exécution du script n'entre pas dans mon if
bloc même si elle $PACKAGENAME
est égale à kakadu-v6_4-00902C
. Qu'est-ce que je fais mal?
bash
shell-script
test
DemiSheep
la source
la source
-eq
est vrai pour les entiers, vous voulez tester une chaîne ou une expression régulière (==
ou=~
): mywiki.wooledge.org/BashGuide/TestsAndConditionalsjasonwryan
je vais jeter un œil à cette ressource!Réponses:
-eq
est un opérateur arithmétique qui compare deux nombres.Utilisez
=
(portable / standardsh
)=~
ou à la==
place.Utilisez également des guillemets, car s'il
${PACKAGENAME}
contient un espace ou un caractère générique, il sera divisé en plusieurs arguments, ce qui permet de[
voir plus d'arguments que souhaité. Voir ici une liste des pièges bash courants.Voir
man bash
, rechercher ( /) pourCONDITIONAL EXPRESSIONS
.la source
polym
je vais jeter un oeil, merci pour la ressource! Je vais ouvrir cet onglet à côté de mon guide VI. :)[[ $PACKAGENAME == "kakadu..." ]]
comme OK.=
,==
et!=
, parce que ce côté est un motif, pas une chaîne. Par exemple,foo='*'; [[ whatever = $foo ]]
c'est vrai.Remplacez
-eq
par==
pour que votre bloc if soit le suivant: -la source
Une autre façon est de les nier:
Le bloc ci-dessus teste d'abord if
"$PACKAGENAME"
a une valeur quelconque, et sinon il se termine avec erreur et fait écho?'this'}
àstderr
. Si son shell parent existe toujours, le test est réussi et il teste ensuite si la suppression de votre chaîne 'kakadu ...' de la variable entraîne une-z
chaîne vide. Si ce n'est pas le cas, il émet à nouveau une erreur et quitte le shell. Si votre shell existe toujours à ce stade après l'exécution du bloc, sinon ce n'est pas le cas.Ce genre de chose est probablement mieux implémenté dans une fonction. Comme:
Avec cette fonction, vous pouvez fournir autant d'arguments que votre système le permet. Si vous fournissez moins de 2, il retournera 1 et émettra un message à
stderr
. Si vous fournissez 2 arguments ou plus, il traitera tous comme des chaînes et renverra 0 si tous sont identiques et non nuls sinon il renverra le numéro d'argument qui échoue en premier la vérification.Dans votre cas, il peut être utilisé comme:
Pour démontrer davantage, j'écrirai une autre fonction:
DÉMO:
SORTIE:
la source