Exécution de commande avec back quotes et variables...

Résolu
Bonjour à tous,

J'ai une question simple, mais je galère depuis bientôt 24h sur ce sujet, cela me pourrit la vie, à moins qu'il n'y ai une autre solution...

je souhaite récupérer via un script, dans une variable, le résultat de la commande suivante shell suivante:

grep -c '"$svc_prov'" forti_svc.txt

Dans le script que j'ai je galère avec une commande de la sorte:

statu_svc=`"grep -c '\"$svc_prov\"' forti_svc.txt"`

Lors de l'éxécution je rencontre une erreur:
./main_rules.sh: line 113: grep -c '"https"' forti_svc.txt: command not found

Alors que cela correspond exactement à la commande que je souhaite exécuter (et qui fonctionne quand on la passe dans le shell).

L'utilisation des quotes simples et double autour de la variable servent à empecher que "httpss" soit trouvé dans le résultat. Je souhaite trouver uniquement "https" avec les guillemets.

voila voila, je pense que c'est un problème de back/simple/double quotes, donc s'il y a des yeuxet cerveaux avertis...et bien merci!

3 réponses

  1. grep -c '"$svc_prov"' forti_svc.txt

    • faute de frappe: c'est bien cela que je souhaite : double quotes entourées des simples quotes
    1. Salut,

      Tu peux soit effectivement utiliser les quotes ` ` pour récupérer un résultat :

      res=`<maCommande>` 


      Ou utiliser, et c'est plus simple, la forme suivante avec parenthèses :

      res=$(<maCommande>)
      1. Merci!
        J'ignorai que l'on pouvait ne pas mettre de back quotes dans la 2e solution.
        Par contre j'ai donc cela dans mon script du coup :
        statu_svc=$(grep -c '\"$svc_prov\"' forti_svc.txt)
        mais lors de l'éxécution le contenu de ma variable n'est pas pris en compte à cause des simples quotes entourant le reste (je crois)...et là je coince encore! :(
      2. Peux-tu donner un extrait de ton fichier forti_svc.txt ainsi que le contenu exact de $svc_prov ?
        Ce sera plus simple ;)
      3. PAs de soucis :)

        $svc_prov est situé dans une boucle et récupère un à un des noms de ports réseau sans guillemets de type http https ou bien encore smi-s-5989.

        forti_svc.txt contient une configuration de firewall dans laquelle je souhaite voir s'il trouve les services récupéré précédemment.

        extrait de forti_svc.txt:
        edit "smi-s-5989"
        edit "smi-s-5988"
        ...

        Je souhaite que smi-s-598 renvoi 0 --> pas de correspondance
        mais que smi-s-5989 renvoi 1 et smi-s-5988 aussi.
    2. Contributeur
      hello
      qu'est ce qui est recherché ?
      exactement "$svc_prov" ou le contenu de la variable svc_prov
      1. C'est le contenu de la variable qui m'intéresse, mais dans le terme exact :

        extrait de forti_svc.txt:
        edit "smi-s-5989"
        edit "smi-s-5988"
        ...

        Je souhaite que smi-s-598 renvoi 0 --> pas de correspondance
        mais que smi-s-5989 renvoi 1 et smi-s-5988 aussi.

        du coup j'ai tenté de mettre des quotes un peu dans tous les sens...mais il y a peu etre plus simple ? :)
      2. Contributeur
        sans ou avec les "
        statu_svc=$(grep -c "$svc_prov" forti_svc.txt) 
        statu_svc=$(grep -c "\"$svc_prov\"" forti_svc.txt)
      3. Nickel ! La 2e solution est la bonne ! Merci!

        commande:
        statu_svc=$(grep -c "\"$svc_prov\"" forti_svc.txt)
        affichage du debug :
        grep -c '"tcp_902-903"' forti_svc.txt
        statu_svc=1

        alors que dans mon fichier j'en ai bien 2 qui auraient pu correspondre sans les bonnes quotes:

        grep "tcp_902-903" forti_svc.txt
        edit "tcp_902-903"
        edit "tcp_902-9033"

        Merci messieurs pour votre aide, je vais enfin le finir ce foutu script ;)
        (passer d'une marque de firewall à une autre quand aucune aide n'est fournie...)
      4. dubcek a été plus rapide ;)

        Je rajouterai que si tu utilises de simple quotes, ta variable n'est plus interprétée ;)
        Ex avec echo :

        toto="bonjour"
        echo "$toto" # affiche "bonjour"
        echo '$toto' # affiche "$toto"
      5. Yes, c'est l'enchainement des quotes qui ne m'est pas forcement familier dans son fonctionnement, mais pour n'en utiliser qu'une c'est toujours bon a rappeller :)