Partage
  • Partager sur Facebook
  • Partager sur Twitter

opérateur binaire attendu ?

et différence entre ${test} et $test

Sujet résolu
    9 septembre 2019 à 0:36:05

    Bonjour,

    J'utilise une condition assez simple qui fonctionne sauf pour les phrase avec un espace :

    if [[ "$test" =~ $rgx ]];then
       echo "trouvé"
    fi

    Je ne comprend pas, j'ai pourtant bien mis les guillemets doubles et il note pour test = 'a a' : ./test.sh: ligne 26 : [: a : opérateur binaire attendu !

    Et si quelqu'un pouvait m’éclairer sur le différence entre ${test} et $test ?

    Merci d'avance

    -
    Edité par bbsebb 9 septembre 2019 à 0:36:19

    • Partager sur Facebook
    • Partager sur Twitter

    << On n'apprend bien qu'à force de se tromper. >>

      9 septembre 2019 à 3:30:02

      les accolades ne sont utiles que lorsqu'il y a du texte accolé au nom de la variable :
      $ var="ga bu zo meu"
      $ echo "$var"
      ga bu zo meu
      $ echo "$varPeuImporte" #aucune variable n'existe avec ce nom
      
      $ echo "${var}PeuImporte"
      ga bu zo meuPeuImporte
      il doit y avoir autre chose (un espace insécable peut-être), a priori ça doit fonctionner tel quel.

      -
      Edité par dantonq 9 septembre 2019 à 3:53:22

      • Partager sur Facebook
      • Partager sur Twitter

      Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique

        9 septembre 2019 à 10:02:37

        bbsebb a écrit:

        Bonjour,

        J'utilise une condition assez simple qui fonctionne sauf pour les phrase avec un espace :

        if [[ "$test" =~ $rgx ]];then
           echo "trouvé"
        fi

        Je ne comprend pas, j'ai pourtant bien mis les guillemets doubles et il note pour test = 'a a' : ./test.sh: ligne 26 : [: a : opérateur binaire attendu !

        Et si quelqu'un pouvait m’éclairer sur le différence entre ${test} et $test ?

        Merci d'avance

        -
        Edité par bbsebb il y a environ 8 heures


        Bonjour,

        Que contiennent les variables ?

        Pour éviter les confusions, je changerais le nom de la variable "test" car c'est aussi le nom d'une commande (Cf. man test).

        Si tu ne comprends pas ce qui se passe, je te conseille de mettre

        set -x
        echo "test=<$test> rgx=<$rgx>"

        avant le " if " :)

        -
        Edité par BugHunt3r 9 septembre 2019 à 10:16:06

        • Partager sur Facebook
        • Partager sur Twitter

        Pensez a mettre +1 aux messages qui vous ont aidé et mettre résolu quand cela l'est.

          9 septembre 2019 à 13:38:51

          bbsebb a écrit:

          Bonjour,

          J'utilise une condition assez simple qui fonctionne sauf pour les phrase avec un espace :

          if [[ "$test" =~ $rgx ]];then
             echo "trouvé"
          fi

          Je ne comprend pas, j'ai pourtant bien mis les guillemets doubles et il note pour test = 'a a' : ./test.sh: ligne 26 : [: a : opérateur binaire attendu !

          Et si quelqu'un pouvait m’éclairer sur le différence entre ${test} et $test ?

          Il faut aussi des guillemets doubles pour $rgx, parce que sinon, si  test=a et rgx="b c", la première ligne s'expanse en

          if [[ "test" =~ a b ]]; then
          

          et on se retrouve avec un b parasite dans le test.

          A propos du nom test :

          • c'est en général une mauvaise idée d'appeler un exécutable ou une fonction test , parce qu'il existe déjà, non pas un, mais deux "test" : la commande interne du shell, et /bin/test
          • pour une variable c'est aussi une mauvaise idée, mais pour des raisons de programmation : ça ne dit pas la signification du test que ça représente.

          -
          Edité par michelbillaud 9 septembre 2019 à 13:41:52

          • Partager sur Facebook
          • Partager sur Twitter
            9 septembre 2019 à 13:44:42

            michelbillaud a écrit:

            Il faut aussi des guillemets doubles pour $rgx, parce que sinon, si  test=a et rgx="b c", la première ligne s'expanse en

            if [[ "test" =~ a b ]]; then
            

            et on se retrouve avec un b parasite dans le test.

            J'y ai pensé... mais en reprenant son code précédé d'un " shebang " ou lancé avec " bash script "

            #!/bin/bash
            set -x
            echo "test=<$test> rgx=<$rgx>"
            
            if [[ "$test" =~ $rgx ]];then
               echo "trouvé"
            fi
            

            Cela fonctionne sur ma VM Linux : que je mette des espaces dans "test" ou dans "rgx"...


            -
            Edité par BugHunt3r 9 septembre 2019 à 13:46:35

            • Partager sur Facebook
            • Partager sur Twitter

            Pensez a mettre +1 aux messages qui vous ont aidé et mettre résolu quand cela l'est.

              9 septembre 2019 à 14:59:05

              D'un autre côté, quand on a le script

              foo="a b"
              
              if [ ${foo} = ${foo} ] ; then
                  echo yes
              else
                  echo no
              fi
              

              on se retrouve avec

              $ bash a.sh 
              a.sh: ligne 8 : [: trop d'arguments
              no
              


              avec ou sans accolades.

              -
              Edité par michelbillaud 9 septembre 2019 à 14:59:49

              • Partager sur Facebook
              • Partager sur Twitter
                9 septembre 2019 à 15:06:13

                les guillemets sont facultatifs dans les tests améliorés ([[ ]]).
                le shell ajoute les protections nécessaires; ce qu'il ne fait pas pour les tests POSIX, pour lesquels les guillemets sont indispensables.
                • Partager sur Facebook
                • Partager sur Twitter

                Validez la réponse utile « Un problème clairement exposé est à moitié résolu. » Pas de MP technique

                  9 septembre 2019 à 15:17:48

                  @michelbillaud,

                  Je suis d'accord avec toi pour le simple crochet "[" qui est l'équivalent de "test"...

                  Mais il utilise le double crochet "[[" qui est plus permissif et permet d'utiliser des opérateurs que "test" ne gère pas.

                  Le "=~" est l'équivalent d"un grep sur une chaine et le "set -x" permet de voir comment elle est évaluée :)

                  Dans mon script je n'initialise pas les deux variables : il faut qu'elles aient été exportées pour être utilisables, c'est pour cette raison que je lui demande de faire un "echo" du contenu de celles-ci.

                  Bien à toi.

                  -
                  Edité par BugHunt3r 9 septembre 2019 à 15:23:40

                  • Partager sur Facebook
                  • Partager sur Twitter

                  Pensez a mettre +1 aux messages qui vous ont aidé et mettre résolu quand cela l'est.

                    9 septembre 2019 à 15:20:54

                    tests, tests améliorés, posix, pas posix.

                    La programmation en shell, ça a toujours été le bordel, ça s'est pas arrangé :-)

                    • Partager sur Facebook
                    • Partager sur Twitter

                    opérateur binaire attendu ?

                    × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                    × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                    • Editeur
                    • Markdown