Comparer deux strings à Bash

J'ai le suivant if bloc 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.

Utilisez = (portable / standard sh ), =~ ou == place.

Utilisez aussi des guillemets, car si ${PACKAGENAME} contient un espace ou un caractère générique, il sera divisé en plusieurs arguments, ce qui entraîne la ${PACKAGENAME} [ voir plus d'arguments que vous le souhaitez. Voir ici une list des pièges communs bash.

 if [ "${PACKAGENAME}" = 'kakadu-v6_4-00902C' ]; then echo "successfully entered if block!!" fi 

Voir man bash , searchr ( / ) pour CONDITIONAL EXPRESSIONS .

Remplacez -eq par == afin que votre bloc if soit 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 "$PACKAGENAME" abord si "$PACKAGENAME" a une valeur quelconque et, s'il ne l'est pas, il se termine par des erreurs et des échos ?'this'} stderr ?'this'} à stderr . Si son shell parent existe toujours, le test est passé et il teste ensuite si la suppression de votre string "kakadu …" de la variable entraîne une string vide -z . Si ce n'est pas le cas, il émet à nouveau une erreur et quitte le shell. Si votre shell existe encore à ce stade, tout ce qui suit le bloc est exécuté, sinon ce n'est pas le cas.

Probablement ce genre de chose est 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 vous le permet. Si vous fournissez less de 2, il renverra 1 et émettra un message à stderr . Si vous fournissez 2 arguments ou plus, il traitera tous comme des strings et returnnera 0 si tous sont identiques et non null sinon il renverra le numéro de l'argument qui échoue le premier.

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 plus loin, 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 } 

DEMO:

 { i= s=ssortingng aeqecho $s #1 aeqecho $s $s #2 aeqecho "$s $s" #3 aeqecho "$s $s" "${s} ssortingng" #4 aeqecho "${s}1" $s ssortingng #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 ssortingng #10 } 

SORTIE:

 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