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é.
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" ]
Vous avez besoin d'espaces:
if [ "$s1" == "$s2" ]
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.
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
Je voudrais suggerer:
#!/bin/bash
s1="hi"
s2="hi"
if [ $s1 = $s2 ]
then
echo match
fi
Sans les guillemets et avec un seul égal.
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
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.
$ if [ "$s1" == "$s2" ]; then echo match; fi
match
$ test "s1" = "s2" ;echo match
match
$
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 =
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 "[".
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
.
#!/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