Question Comment puis-je comparer deux variables de chaîne dans une instruction 'if' dans Bash?


J'essaie d'obtenir un if déclaration à travailler dans Frapper (en utilisant Ubuntu):

#!/bin/bash

s1="hi"
s2="hi"

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

J'ai essayé différentes formes de if déclaration, en utilisant [["$s1" == "$s2"]], avec et sans devis, en utilisant =, == et -eq, mais j'ai toujours l'erreur suivante:

[hi: commande non trouvée

J'ai regardé divers sites et tutoriels et copié ceux-ci, mais cela ne fonctionne pas - qu'est-ce que je fais mal?

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

J'ai juste travaillé sur les espaces bit ..: / Comment dire je contient?

j'ai essayé

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

mais ça n'a pas marché.


415
2017-11-25 13:39


origine


Réponses:


Pour la comparaison de chaînes, utilisez:

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

Pour le a contient b, utilisation:

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

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

mal:

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

bien:

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

574
2017-11-25 13:49



Vous avez besoin d'espaces:

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

137
2017-11-25 13:40



Vous devriez faire attention à laisser un espace entre le signe de '[' et les guillemets où la variable contient ceci:

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

le ^s montre les espaces vides que vous devez quitter.


106
2018-01-29 15:16



Je suggère celui-ci:

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

Notez l'espace blanc entre les parenthèses d'ouverture / fermeture et les variables et aussi les espaces blancs entourant le signe '='.

Aussi, faites attention à votre en-tête de script. Ce n'est pas la même chose que tu utilises

#!/bin/bash

ou

#!/bin/sh

Voici la source.


27
2017-11-27 14:29



Je voudrais suggerer:

#!/bin/bash

s1="hi"
s2="hi"

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

Sans les guillemets doubles et avec un seul égal.


10
2017-11-25 13:42



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

7
2017-11-25 13:52



Cette question a déjà d'excellentes réponses mais ici il semble qu'il y ait une légère confusion entre l'utilisation de simples égaux et doubles égaux

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

La principale différence réside dans le langage de script que vous utilisez. Si vous utilisez frapper puis inclure #!/bin/bash dans le démarrage du script et enregistrer votre script en tant que filename.bash. Pour exécuter l'utilisation bash filename.bash - alors vous devez utiliser ==.

Si vous utilisez sh alors utilisez #!/bin/sh et sauvegardez votre script en tant que filename.sh. Pour exécuter l'utilisation sh filename.sh - alors vous devez utiliser single =. Évitez de les mélanger.


7
2018-03-29 08:42



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

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


6
2017-11-25 13:43



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

[hi: commande non trouvée

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

Contrairement à des langages de programmation plus traditionnels, dans Bash, "[" est une commande comme les "ls" plus évidents, etc. - elle n'est pas traitée spécialement simplement parce qu’elle est un symbole, d’où le "ss "qui sont immédiatement côte à côte dans votre question, sont jointes (comme il est correct pour Bash) et il essaie ensuite de trouver une commande dans cette position: [hi - qui est inconnu à Bash.

En C et dans certains autres langages, le "[" serait considéré comme une "classe de caractères" différente et serait disjointe du "hi" suivant.

Vous avez donc besoin d'un espace après l'ouverture "[".


4
2017-08-13 10:26



#!/bin/bash

s1="hi"
s2="hi"

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

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

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

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

2
2017-11-25 13:47