IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

[sed] Utiliser une variable shell


Sujet :

Shell et commandes GNU

  1. #1
    Invité
    Invité(e)
    Par défaut [sed] Utiliser une variable shell
    Bonjour,
    J'ai une question très bête mais qui me bloque depuis ce matin.
    Je souhaiterais passer en paramètre d'une fonction :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed '1,10d' |sed '$d'|sed '$d'|sed '$d'| sed 's/,$//'| sed "s/^\ *//g"| sed "s/\" *//g"| sed "s/\:*//g"

    Le problème c'est que ça ne marche pas j'ai essayé les guillemets les côtes, les crochets....

    Mais rien ne marche est-ce que cela est au moins possible ?

    Merci et bonne après midi
    Dernière modification par N_BaH ; 08/08/2021 à 13h53. Motif: clarification titre

  2. #2
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 293
    Par défaut
    Bonjour

    Un très bon exercice pour toi. Comprendre les quotes.
    Les 'simple quotes' protègent de toute interprétation.
    Les "doubles quotes" protègent, mais laissent passer des interprétations comme les variables, par exemple.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $ var=toto
    $ echo blabla$var
    blablatoto
    $ echo 'blabla$var'
    blabla$var
    $ echo "blabla$var"
    blablatoto
    $
    Ton expression contient des 'simple quotes' et des "double quotes". Donc il va falloir être minutieux dans la protection. Tu crois que les quotes du milieu sont protégés alors qu'ils sortent juste de la protection.
    • Tu peux laisser les simple quotes dans les double quotes, et inversement.
    • Si tu veux un simple quote dans des simple quotes, tu sors, tu écris le caractère et tu rentres.
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      $ echo 'J'\''ai un texte qui ne doit pas être interprété.'
      J'ai un texte qui ne doit pas être interprété.
    • Si tu veux un double quote dans des double quotes, tu échappes le caractère.
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      $ echo "J'ai un \"texte\" qui ne doit pas être interprété."
      J'ai un "texte" qui ne doit pas être interprété.

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Merci beaucoup pour ta réponse.
    Effectivement lors de mes tests je faisais le travail à moitié.
    J'ai donc apporté les modifs de la façon suivante, j'ai entouré le code de guillemets pour l'interprétation du code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    "sed '\''1,10d'\'' |sed '\''$d'\''|sed '\''$d\''|sed '\''$d'\''| sed '\''s/,$//'\''| sed \"s/^\ *//g\"| sed \"s/\" *//g\"| sed \"s/\:*//g\""
    Quand je fais en écho sur le paramètre j'obtiens :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sed '\''1,10d'\'' |sed '\'''\''|sed '\''\''|sed '\'''\''| sed '\''s/,$//'\''| sed "s/^\ *//g"| sed "s/" *//g"| sed "s/\:*//g"
    Est ce que j'ai mal identifié et modifier l'interprétation des caractères spéciaux ?

    Je me retrouve avec l'erreur:
    Sed : -e expression #1, char 1: unknown command: `' '

    Pourtant je n'ai rien comme Sed -e

    Update : le problème ne semble concerner que les simples quotes. Les guillemets sembles parfait

    Merci
    Dernière modification par Invité ; 05/08/2021 à 09h30.

  4. #4
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 664
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 664
    Par défaut
    en général, quand une commande se pipe à elle-même (commande | commande), une seule instance de cette commande devrait suffire.

    il faudrait donc d'abord que tu simplifies ta ligne de commande.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Salut,
    Alors pour le coup je n'ose pas trop c'est un bout de code qu'on m'a donné et totalement fonctionnel pour passer les tests.
    J'aurais peur de toucher quelque chose et perdre de l'info

  6. #6
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 293
    Par défaut
    Dans la ligne initiale, je ne vois pas pourquoi utiliser des double quotes, toujours dangereux avec sed, puisque $ est souvent présent, potentiellement interprété comme une variable. C'est d'ailleurs ce qui, selon moi, à motiver l'utilisation des simple quotes dans les 4 premières commandes, puisque $d est interprété comme une variable et pas comme "à la dernière ligne, détruire". Les scripts sed doivent toujours être entourés de simple quotes, sauf en cas de besoins spécifiques.

    J'ai donc apporté les modifs de la façon suivante, j'ai entouré le code de guillemets pour l'interprétation du code
    Aucune modification n'est nécessaire si le signe n'est pas le même. Là, tu modifies un simple quote, alors que la protection est assurée par un double quote. Faute.

  7. #7
    Invité
    Invité(e)
    Par défaut
    Alors voilà ma nouvelle version
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sed '\'1,10d'\' |sed '\'$d'\'|sed '\'$d'\'|sed '\'$d'\'| sed '\'s/,$//'\'| sed "s/^\ *//g"| sed "s/\" *//g"| sed "s/\:*//g"'
    Je vais me permettre de vous expliquer ma démarche car je ne suis pas sûr de tout saisir

    J'avais délimiter le code avec des guillemets car sinon cela me dit qu'il ne trouve pas la caractère de fin (avec l'exemple ci dessous et en utilisant des simples quotes)

    Après je ne comprends le double simple quote par exemple Sed '\' ' 1,10d '\' '

    Après je délimite tout ce qui est entre simple quote mais pas ce qui est entre guillemets

    Bon après midi

  8. #8
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 293
    Par défaut
    C'est bon, sauf qu'il manque le simple quote du début.

  9. #9
    Invité
    Invité(e)
    Par défaut
    Oui erreur de saisie de ma part lorsque j'ai fait le post.

    Par contre lorsque je lance le script j'ai les messages :
    Unexpected EOF while looking for matching ` ' '
    Unexpected end of file

    C'est initialement pour ça que j'avais mis les guillemets

  10. #10
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 664
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 664
    Par défaut
    c'est un bout de code qu'on m'a donné

    il ne faut pas accepter tout ce qu'on te donne.
    un jour, un vieux monsieur va vouloir te donner des bonbons...
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  11. #11
    Invité
    Invité(e)
    Par défaut
    Ahahah, oui on est bien d'accord, néanmoins il s'agit d'un bout de code de mon prof donc je lui fais (peut-être à tord) confiance.
    Après oui il y a de la répétition dans le début avec le sed '$d' mais comment "optimiser" sans perte ?
    De toute façon pour l'instant ça ne marche pas avec les simples quotes

  12. #12
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 664
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 664
    Par défaut
    on ne sait pas ce que ça traite, on ne va donc pas pouvoir optimiser.

    le problème principal du code de ton premier message (outre les "auto-pipes"), c'est qu'un Développement de paramètre n'est pas réalisé entre apostrophes.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  13. #13
    Invité
    Invité(e)
    Par défaut
    Salut,
    Ca voudrait dire que pour que le paramètre soit pris en compte il faut que je laisse les simples quotes en début et fin du paramètre et que je mette des guillemets au niveau des pipes ?

  14. #14
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 293
    Par défaut
    Mais c'est pas encore réglé ce problème ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $ function montest
    > {
    > echo $1
    > }
    $ montest toto
    toto
    $ montest "sed '1,10d' |sed '\$d'|sed '\$d'|sed '\$d'| sed 's/,$//'| sed 's/^ *//g'| sed 's/\" *//g'| sed 's/:*//g'"
    sed '1,10d' |sed '$d'|sed '$d'|sed '$d'| sed 's/,$//'| sed 's/^ *//g'| sed 's/" *//g'| sed 's/:*//g'
    $ montest 'sed '\''1,10d'\'' |sed '\''$d'\''|sed '\''$d'\''|sed '\''$d'\''| sed '\''s/,$//'\''| sed "s/^\ *//g"| sed "s/\" *//g"| sed "s/\:*//g"'
    sed '1,10d' |sed '$d'|sed '$d'|sed '$d'| sed 's/,$//'| sed "s/^\ *//g"| sed "s/\" *//g"| sed "s/\:*//g"
    De plus, cette question sent mauvais depuis le début. Ça sent les mauvaises pratiques. Tu transmets une chaîne de caractères à une fonction ? Et après, quoi ? Tu l'exécutes ? Avec eval ? Ce qui veut dire que n'importe qui transmettant n'importe quelle chaîne de caractères peut faire exécuter n'importe quel code dangereux à ton ordinateur ? C'est ça le projet ? C'est mauvais. C'est une faille de sécurité. Il ne faut pas faire cela.

    Quel est le vrai énoncé complet ?

  15. #15
    Invité
    Invité(e)
    Par défaut
    Bonjour,
    Je vais réessayer pour voir si ça tourne comme il faut chez moi.

    Concernant l'explication :
    Je dois faire des curls au travers d'une boucle. Le Curl va récupérer des données qui vont être restucturé dans le format json et stocké dans un fichier.
    Il m'était demandé de rejouer les curls en échec.
    Nous avons donc fait rajouté dans la fonction Curl cette ligne (grâce à l'aide du forum):
    Json_reformat< fichier | $formatage >résultats.json

    $formatage est le fameux paramètre "Sed ...| Sed...|"
    J'ai décidé de faire comme ça car dans le code j'ai trois curl pour lequel le json reformat n'est pas le même.
    Je passe donc la valeur reformat en paramètre

  16. #16
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 664
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 664
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Json_reformat< fichier | $formatage >résultats.json
    mauvaise pratique.
    utilise une fonction à la place d'une variable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    formatage() {
       case $1 in
       format_1) ...
       ;;
       format_2) ...
       ;;
       format_3) ...
       ;;
       esac
    }
    ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    curl ... | refomat | formatage format_N
    ça sent l'usine à gaz !
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  17. #17
    Invité
    Invité(e)
    Par défaut
    Oui oui une véritable usine à gaz.
    Je vais étudier ta proposition, merci

  18. #18
    Invité
    Invité(e)
    Par défaut
    Bonjour à tous,
    J'ai un peu réfléchi à ta proposition sur l'utilisation d'une fonction.
    Je vois et comprends effectivement l'intérêt de cette pratique néanmoins en raison de l'implémentation actuelle du code ça me paraît difficile.
    Effectivement j'appelle dans le code la fonction Curl (celle qui permet de vérifier que le Curl a fonctionné et si ce n'est pas le cas rejouer la requête)avec comme paramètre l'URL. Pour cette raison je ne peux pas appeler une fonction dans une fonction.
    Après ce n'est pas l'utilisateur qui saisit les paramètres tout est déjà dans le code

  19. #19
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 664
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 664
    Par défaut
    vérifier que le Curl a fonctionné et si ce n'est pas le cas rejouer la requête)avec comme paramètre l'URL. Pour cette raison je ne peux pas appeler une fonction dans une fonction.
    je ne vois pas le rapport.


    Après ce n'est pas l'utilisateur qui saisit les paramètres tout est déjà dans le code
    ça doit être "conditionnable"...
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  20. #20
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 293
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 293
    Par défaut
    Citation Envoyé par flash026 Voir le message
    je ne peux pas appeler une fonction dans une fonction.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $ function niveau_3
    > {
    > echo "Ici, le niveau 3"
    > }
    $ function niveau_2 { echo "Ici, le niveau 2"; niveau_3; }
    $ function niveau_1 { echo "Ici, le niveau 1"; niveau_2; }
    $ niveau_1
    Ici, le niveau 1
    Ici, le niveau 2
    Ici, le niveau 3
    On peut toujours appeler une fonction dans une fonction.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Utiliser une variable avec sed
    Par Eto Demerzel dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 11/04/2015, 20h33
  2. Réponses: 21
    Dernier message: 21/08/2008, 23h30
  3. Utilisation de sed avec une variable
    Par Neuromancien2 dans le forum Linux
    Réponses: 5
    Dernier message: 18/07/2008, 17h53
  4. Utiliser une variable d'un script shell
    Par GomuSan dans le forum C
    Réponses: 14
    Dernier message: 10/01/2008, 10h49
  5. [XSL] utiliser une variable pour nom d'élément
    Par luta dans le forum XSL/XSLT/XPATH
    Réponses: 13
    Dernier message: 07/09/2004, 13h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo