J'ai le bloc if
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 bloc if
même si $PACKAGENAME
est égal à kakadu-v6_4-00902C
. Qu'est-ce que je fais mal?
-eq
est un opérateur arithmétique qui compare deux nombres.
Utilisation =
(portable/standard sh
), =~
ou ==
au lieu.
Utilisez également des guillemets, car si ${PACKAGENAME}
contient un espace ou un caractère générique, puis il sera divisé en plusieurs arguments, ce qui fait que [
voir plus d'arguments que souhaité. Voir ici une liste des pièges bash courants.
if [ "${PACKAGENAME}" = 'kakadu-v6_4-00902C' ]; then
echo "successfully entered if block!!"
fi
Voir man bash
, chercher (/) pour CONDITIONAL EXPRESSIONS
.
Remplacer -eq
avec ==
donc votre bloc if serait le suivant: -
if [ ${PACKAGENAME} == kakadu-v6_4-00902C ]; then
echo "successfully entered if block!!"
fi
Une autre façon est de les nier:
: ${PACKAGENAME:?'$PACKAGENAME variable is empty!'} #emits error and exits
[ -z "${PACKAGENAME#kakadu-v6_4-00902C}" ] || { #if var - str not empty do block
echo '$PACKAGENAME is not kakadu-v6_4-00902C'
exit 1
} >&2
Le bloc ci-dessus teste d'abord si "$PACKAGENAME"
a n'importe quelle valeur, 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 un -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, quoi que ce soit 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:
argeq() ( i= : ${2?^MERR: not enough parameters!} #$#>=2 || quit w/ err ^M == \r
z() { return $((${#1}>0)) ; } #return 1 if ${#1}>0 else 0
until z "${2+?}" $((i=i+1)) #until $2 is not set...
do ! z "$1" && z "${1#"$2"}" || #$1 != '' && $1 - $2 == '' or...
exit $((i${1:++1})) #exit $? == failed arg count
shift ; done #shift away one param ; continue loop
)
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 retournera 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:
{
PACKAGENAME='kakadu-v6_4-00902C'
argeq "$PACKAGENAME" kakadu-v6_4-00902C &&
echo "kakadu-v6_4-00902C == $PACKAGENAME" ||
echo failure
! argeq "${PACKAGENAME#*-}" kakadu-v6_4-00902C &&
echo "kakadu-v6_4-00902C != ${PACKAGENAME#*-}" ||
echo failure
}
###OUTPUT###
kakadu-v6_4-00902C == kakadu-v6_4-00902C
kakadu-v6_4-00902C != v6_4-00902C
Pour démontrer davantage, j'écrirai une autre fonction:
aeqecho() { i=$((i+1)) #inc for line#
argeq "$@" && echo "$i : yay" || #allswell or
! e=$? ${2+:} return || #save $?; ! exclusive || to drop ERRs
echo "$i : shite - arg$e failed" #report failure
}
{ i= s=string
aeqecho $s #1
aeqecho $s $s #2
aeqecho "$s $s" #3
aeqecho "$s $s" "${s} string" #4
aeqecho "${s}1" $s string #5
aeqecho "" "" "" #6
aeqecho "" "$s" $s #7
aeqecho 1 "${s#$s}1" $((2-1)) #8
aeqecho $s $s $s $s $s $s $s $s $s $s $s $s stng #9
aeqecho $s $s $s $s $s $s $s $s $s $s $s $s string #10
}
ERR: not enough parameters!
2 : yay
ERR: not enough parameters!
4 : yay
5 : shite - arg2 failed
6 : shite - arg1 failed
7 : shite - arg1 failed
8 : yay
9 : shite - arg13 failed
10 : yay