web-dev-qa-db-fra.com

Comment comparer deux variables de chaîne dans une instruction 'if' dans Bash?

J'essaie d'obtenir une instruction if pour qu'elle fonctionne dans Bash (en utilisant bunt ):

#!/bin/bash

s1="hi"
s2="hi"

if ["$s1" == "$s2"]
then
  echo match
fi

J'ai essayé diverses formes de l'instruction if, en utilisant [["$s1" == "$s2"]], avec et sans guillemets, en utilisant =, == et -eq, mais j'obtiens toujours l'erreur suivante:

[salut: commande non trouvée

J'ai consulté divers sites et tutoriels et les ai copiés, mais cela ne fonctionne pas. Qu'est-ce que je fais de travers?

Finalement, je veux dire si $s1 contient $s2, alors comment puis-je faire cela?

Je viens de travailler sur les espaces peu ..:/Comment je dis contient?

J'ai essayé

if [[ "$s1" == "*$s2*" ]]

mais ça n'a pas marché.

559
Mr Shoubs

Pour comparer les chaînes, utilisez:

if [ "$s1" == "$s2" ]

Pour la a contient b, utilisez:

if [[ $s1 == *"$s2"* ]]

(et assurez-vous d'ajouter des espaces entre les symboles):

mauvais:

if ["$s1" == "$s2"]

bien:

if [ "$s1" == "$s2" ]
776
marcog

Vous avez besoin d'espaces:

if [ "$s1" == "$s2" ]
153
unwind

Veillez à laisser un espace entre le signe de '[' 'et les guillemets doubles où la variable contient ceci:

if [ "$s1" == "$s2" ]; then
#   ^     ^  ^     ^
   echo match
fi

Les ^s indiquent les espaces vides que vous devez quitter.

136
trejo08

Je suggère celui-ci:

if [ "$a" = "$b" ]

Notez l’espace blanc entre les crochets d’ouverture/fermeture et les variables, ainsi que les espaces blancs entourant le signe '='.

Faites également attention à votre en-tête de script. Ce n'est pas la même chose si vous utilisez

#!/bin/bash

ou

#!/bin/sh

Voici la source .

32
Abderrazak BOUADMA

Je voudrais suggerer:

#!/bin/bash

s1="hi"
s2="hi"

if [ $s1 = $s2 ]
then
  echo match
fi

Sans les guillemets et avec un seul égal.

16
jzrk

Bash4 + exemples. Remarque: ne pas utiliser de guillemets causera des problèmes lorsque les mots contiennent des espaces, etc. Toujours citer entre guillemets dans IMO.

Voici quelques exemples BASH4 +:

Exemple 1, recherchez "oui" dans la chaîne (insensible à la casse):

if [[ "${str,,}" == *"yes"* ]] ;then

Exemple 2, recherchez "oui" dans la chaîne (insensible à la casse):

if [[ "$(echo "$str" | tr '[:upper:]' '[:lower:]')" == *"yes"* ]] ;then

Exemple 3, recherchez "oui" dans la chaîne (sensible à la casse):

 if [[ "${str}" == *"yes"* ]] ;then

Exemple 4, recherchez 'oui' dans la chaîne (sensible à la casse):

 if [[ "${str}" =~ "yes" ]] ;then

Exemple 5, correspondance exacte (sensible à la casse):

 if [[ "${str}" == "yes" ]] ;then

Exemple 6, correspondance exacte (insensible à la casse):

 if [[ "${str,,}" == "yes" ]] ;then

Exemple 7, correspondance exacte:

 if [ "$a" = "$b" ] ;then
15
Mike Q

Cette question a déjà de bonnes réponses, mais ici, il semble y avoir une légère confusion entre l’utilisation du simple égal et du double égal.

if [ "$s1" == "$s2" ]

La principale différence réside dans le langage de script que vous utilisez. Si vous utilisez bash alors incluez #!/bin/bash dans le début du script et enregistrez votre script sous filename.bash. Pour exécuter, utilisez bash filename.bash - vous devez alors utiliser ==.

Si vous utilisez sh, utilisez #!/bin/sh et enregistrez votre script sous filename.sh. Pour exécuter, utilisez sh filename.sh - vous devez alors utiliser un seul =. Évitez de les mélanger.

13
Rahul Dahiya
$ if [ "$s1" == "$s2" ]; then echo match; fi
match
$ test "s1" = "s2" ;echo match
match
$
9
qwerty

Je n'ai pas accès à une boîte Linux à l'heure actuelle, mais [est en fait un programme (et une commande intégrée bash), je pense donc que vous devez insérer un espace entre [et le premier paramètre.

Notez également que l'opérateur d'égalité de chaîne semble être un simple =

7
Mrki

C'est plus de clarification que de réponse! Oui, l'indice est dans le message d'erreur:

[salut: commande non trouvée

ce qui vous montre que votre "salut" a été concaténé au "[".

Contrairement aux langages de programmation plus traditionnels, dans Bash, "[" est une commande comme le plus évident "ls", etc. - elle n'est pas traitée spécialement parce que c'est un symbole, d'où le "[" et le (substitué) "$ s1 "qui sont immédiatement côte à côte dans votre question, sont joints (comme cela est correct pour Bash) et il essaie ensuite de trouver une commande dans cette position: [hi - qui est inconnu de Bash.".

En C et dans quelques autres langues, le "[" serait perçu comme une "classe de caractères" différente et serait disjoint du suivant "hi".

Par conséquent, vous avez besoin d’un espace après l’ouverture "[".

6
MikeW

Pour une version avec Bash pur et sans test, mais vraiment moche, essayez:

if ( exit "${s1/*$s2*/0}" )2>/dev/null
then
   echo match
fi

Explication: Dans ( ), un sous-shell supplémentaire est ouvert. Il se ferme avec 0 s'il y avait une correspondance et tente de sortir avec $ s1 s'il n'y a pas de correspondance qui soulève une erreur (moche). Cette erreur est dirigée vers /dev/null.

3
user2546460
#!/bin/bash

s1="hi"
s2="hi"

if [ "x$s1" == "x$s2" ]
then
  echo match
fi

Ajouter une chaîne supplémentaire à l'intérieur le rend plus sûr.

Vous pouvez également utiliser une autre notation pour les commandes sur une seule ligne:

[ "x$s1" == "x$s2" ] && echo match
3
mpapis