Question Comment comparer les chaînes dans Bash


Comment comparer une variable à une chaîne (et faire quelque chose si elles correspondent)?


633
2018-02-10 13:31


origine


Réponses:


Essaye ça:

if [ "$x" = "valid" ]; then
  echo "x has the value 'valid'"
fi

Si vous voulez faire quelque chose quand ils ne correspondent pas, remplacez = avec !=. Vous voulez les citations autour $x, parce que si $x est vide, vous aurez if [ = "valid" ]... ce qui est une erreur de syntaxe.


Notez que bash permet == à utiliser avec [, mais ce n'est pas standard. Soit utiliser [[ "$x" == "valid" ]] (Dans ce cas, les citations autour $x sont optionnels) ou [ "$x" = "valid" ].


909
2018-02-10 13:34



Ou, si vous n'avez pas besoin d'une autre clause:

[ "$x" == "valid" ] && echo "x has the value 'valid'"

102
2018-02-10 13:45



Pour comparer des chaînes avec des caractères génériques

if [[ "$stringA" == *$stringB* ]]; then
  # Do something here
else
  # Do Something here
fi

51
2018-04-28 14:22



a="abc"
b="def"

# Equality Comparison
if [ "$a" == "$b" ]; then
    echo "Strings match"
else
    echo "Strings don't match"
fi

# Lexicographic (greater than, less than) comparison.
if [ "$a" \< "$b" ]; then
    echo "$a is lexicographically smaller then $b"
elif [ "$a" \> "$b" ]; then
    echo "$b is lexicographically smaller than $a"
else
    echo "Strings are equal"
fi

Remarques:

  1. Espaces entre if et [ et ] sont importants
  2. > et < sont les opérateurs de redirection afin d'échapper à \> et \< respectivement pour les cordes.

39
2017-08-14 09:08



Je suis en désaccord avec l'un des commentaires sur un point:

[ "$x" == "valid" ] && echo "valid" || echo "invalid"

Non, ce n'est pas un fou

C'est juste que ça ressemble à ça, hmm, les non-initiés ...

Il utilise d'une certaine manière des modèles communs en tant que langage;

Et après avoir appris la langue.

En fait, c'est sympa de lire

C'est une expression logique simple, avec une partie spéciale: évaluation paresseuse des opérateurs logiques.

[ "$x" == "valid" ] && echo "valid" || echo "invalid"

Chaque partie est une expression logique; le premier peut être vrai ou faux, les deux autres sont toujours vrais.

(
[ "$x" == "valid" ] 
&&
echo "valid"
)
||
echo "invalid"

Maintenant, quand il est évalué, le premier est vérifié. Si c'est faux, que le deuxième opérande de la logique et  && après ce n'est pas pertinent. Le premier n'est pas vrai, donc ça ne peut pas être le premier et le second être vrai, de toute façon.
Maintenant, dans ce cas est le premier côté de la logique ou  || faux, mais cela pourrait être vrai si l'autre partie - la troisième partie - est vraie.

Ainsi, la troisième partie sera évaluée - en écrivant principalement le message comme un effet secondaire. (Il a le résultat 0 pour vrai, que nous n'utilisons pas ici)

Les autres cas sont similaires, mais plus simples - et - je promets! sont - peuvent être - faciles à lire!
 (Je n'en ai pas, mais je pense qu'être un vétéran d'UNIX avec la barbe grise aide beaucoup avec ceci.)


21
2018-03-22 13:45



vous pouvez également utiliser le cas d'utilisation / esac

case "$string" in
 "$pattern" ) echo "found";;
esac

18
2018-02-10 19:58



Le script suivant lit à partir d'un fichier nommé "testonthis" ligne par ligne puis compare chaque ligne avec une chaîne simple, une chaîne avec des caractères spéciaux et une expression régulière si elle ne correspond pas alors le script imprimera la ligne o / w non.

l'espace à bash est tellement important. donc suivant travaillera

[ "$LINE" != "table_name" ] 

mais ne suivra pas:

["$LINE" != "table_name"] 

donc s'il vous plaît utiliser comme est:

cat testonthis | while read LINE
do
if [ "$LINE" != "table_name" ] && [ "$LINE" != "--------------------------------" ] && [[ "$LINE" =~ [^[:space:]] ]] && [[ "$LINE" != SQL* ]]; then
echo $LINE
fi
done

9
2018-06-21 10:57



J'utiliserais probablement des correspondances regexp si l'entrée n'a que quelques entrées valides. Par exemple. seuls les "start" et "stop" sont des actions valides.

if [[ "${ACTION,,}" =~ ^(start|stop)$ ]]; then
  echo "valid action"
fi

Notez que je minuscule la variable $ACTION en utilisant la double virgule. Notez également que cela ne fonctionnera pas sur les versions de bash trop anciennes là-bas.


8
2017-12-04 09:04



Je l'ai fait de cette façon qui est compatible avec bash, dash (sh):

testOutput="my test"
pattern="my"

case $testOutput in (*"$pattern"*)
    echo "if there is a match"
    exit 1
    ;;
(*)
   ! echo there is no coincidence!
;;esac

1
2018-03-22 13:51