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 :

Utiliser variable dans une requete curl API cloudflare ne fonctionne pas.


Sujet :

Shell et commandes GNU

  1. #1
    Candidat au Club
    Homme Profil pro
    Code pour le fun
    Inscrit en
    Septembre 2022
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Code pour le fun

    Informations forums :
    Inscription : Septembre 2022
    Messages : 3
    Par défaut Utiliser variable dans une requete curl API cloudflare ne fonctionne pas.
    Bonjour à tous,

    Voilà j'ai comme projet de faire un script qui mettrait à jour mon IP dans la règles (policies) cloudflare qui autorise les accès à mes service auto-hébergés. Mais le problème n'est pas la j'ai trouvé la bonne commande Curl pour cette mise à jour dans les API cloudflare.
    J'ai commencer à faire un script qui détecte les changements d'IP depuis sa dernière exécution (jusque la tout vas bien) et si l'IP a changé je veux exécuté un code qui inclue l'adresse IP stockée dans une variable... et c'est la que les ennuis commencent.
    La commande curl fonctionne bien avec une adresse IP mais si à la place de l'adresse IP je tente de mettre la variable ça ne marche plus j'ai essayé pas mal de choses mais ça ne marche pas.
    C'est mon premier script j'ai du m'aider de google pour quasiment chaque commande mais la je coince et mes recherches ne donnent pas vraiment de résultat.
    Voici mon script l'IP remplacer par une variable et tout à la fin de l'avant dernière ligne "--data" (j'ai bien sur enlevé tout mes tokens perso):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    #!/bin/bash
    new_ip=$(dig +short myip.opendns.com @resolver1.opendns.com)
    current_ip=`cat current_ip.txt`
    if [ "$new_ip" = "$current_ip" ]
    then 
    	echo 'pas de changement ip'
    	exit 0
    else
    	echo $new_ip> current_ip.txt
    fi
     
    curl -X PUT "https://api.cloudflare.com/client/v4/accounts/**token de mon compte**/access/apps/**token de l'app**/policies/**token de la regle**" \
         -H "X-Auth-Email: moi@mail.com" \
         -H "X-Auth-Key: **Mon token d'identification**" \
         -H "Content-Type: application/json" \
         --data '{"precedence":1,"decision":"bypass","name":"IP","include":[{"ip":{"ip":"$new_ip"}}]}'	 
     
    echo 'Mise à jour effectuée'
    Donc j'ai besoin de votre aide pour que la variable "new_ip" soient prise en compte. En l'état la requête part tel quel et cloudflare me renvoie une erreur ("message": "access.api.error.invalid_request: invalid json in policy rule").

    Merci d'avance pour votre aide.
    Bon dimanche.

  2. #2
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Bonjour

    Première remarque: si l'iP est inchangée, tu quittes le script. Le "else" n'a donc pas lieu d'être. Et dans les redirections on a l'habitude de coller la redirection au fichier de destination et non pas à la commande => echo "$new_ip" >current_ip.txt.
    Ensuite, on écrit toujours les chaines entre quotes => new_ip="$(dig +short myip.opendns.com @resolver1.opendns.com)" et current_ip="`cat current_ip.txt`". Pour une affectation ça n'a pas d'importance mais ça en aura pour les comparaisons donc si on prend l'habitude de le faire tout le temps on ne tombera pas dans le piège idiot où le test [ $toto = $titi ] plantera connement parce que la variable "titi" contient une phrase et que le shell considèrera chacun des mots de la phrase comme autant d'éléments distincts et non pas comme un seul (sans parler de l'autre cas où titi est vide et où le shell ne voyant rien à comparer te répond alors qu'il manque un opérande...)
    Concernant la variable "current_ip" on peut se poser la question sur l'utilisation de l'ancienne écriture de substitution de commande `commande` au lieu de la plus récente et plus lisible $(commande) (d'autant plus que tu la connais puisque tu l'utilises juste au dessus) et surtout de l'utilité de cette variable qui n'est utilisée qu'une seule fois.

    Pour ton souci principal, il provient du fait que tu utilises des quotes simples pour l'option "--data" et que dans ce cas, une variable n'est alors pas interprétée.
    Exemple
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    >>> toto="Hello World !!!"
    >>> echo "$toto"
    Hello World !!!
    >>> echo '$toto'
    $toto
    D'où le fait que l'utilisation de doubles quotes en tout temps (qui justement ne bloquent ni les variables, ni les substitution de commandes) permet de résoudre beaucoup de soucis liés aux strings avec espace...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  3. #3
    Candidat au Club
    Homme Profil pro
    Code pour le fun
    Inscrit en
    Septembre 2022
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Code pour le fun

    Informations forums :
    Inscription : Septembre 2022
    Messages : 3
    Par défaut
    Sve@r je te remercie ça n'as pas marché du premier coup mais en m'inspirant d'un autre script j'ai réussi (d’ailleurs ce script utilise bien les doubles quotes je n'avais pas fait attention...)
    https://github.com/K0p1-Git/cloudflare-ddns-updater

    Pour les bizarreries de mon code. Bah c'est mon premier code et je demandais à google pour chaque ligne "comment mettre un fichier texte dans une variable bash" ou "comment ecrire une variable bash dans un fichier texte" et je prenais le premier résultat qui fonctionnais. J'ai apporté les modifications que tu as suggéré merci.
    En revanche pour le else inutile si les IP sont différente il faut bien que je mette else non ?
    Et pour les simples quote pareil j'ai bêtement copié le code des documentation clouflare en l'adaptant à mon besoin https://api.cloudflare.com/#access-p...-access-policy

    Donc voilà mon script corrigé et fonctionnel:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    #!/bin/bash
    new_ip="$(dig +short myip.opendns.com @resolver1.opendns.com)"
    if [ "$new_ip" = "$(cat current_ip.txt)" ]
    then 
    	echo 'pas de changement ip'
    	exit 0
    else
    	echo $new_ip> current_ip.txt
    fi
     
    curl -X PUT "https://api.cloudflare.com/client/v4/accounts/**token de mon compte**/access/apps/**token de l'app**/policies/**token de la regle**" \
         -H "X-Auth-Email: moi@mail.com" \
         -H "X-Auth-Key: **Mon token d'identification**" \
         -H "Content-Type: application/json" \
         --data "{\"precedence\":1,\"decision\":\"bypass\",\"name\":\"IP\",\"include\":[{\"ip\":{\"ip\":\"$new_ip\"}}]}"
     
    echo 'Mise à jour effectuée'
    Est ce que ce genre de script est assez léger pour être lancé toutes les minutes (même si en vrai je pense plutôt le faire toutes les 10 ou 15 minutes ça me semble suffisant).

    En tout cas encore merci pour ton aide je commençais à m'arracher les cheveux

  4. #4
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Rutsah Voir le message
    En revanche pour le else inutile si les IP sont différente il faut bien que je mette else non ?
    Non, puisque dans le cas du "if" le script s'arrête. Corollaire, s'il continue c'est que fatalement tu es dans un "else" implicite. D'ailleurs tu dois le sentir puisque la commande "curl" n'est pas dans le "else" mais ne s'exécute que si les IP sont différentes...

    Citation Envoyé par Rutsah Voir le message
    Donc voilà mon script corrigé et fonctionnel:
    Les chaines se mettent entre quotes doubles. Toutes les chaines. Seules exceptions, quand on utilise "tr" ou "awk" parce que même si les quotes doubles sont possibles, la syntaxe est plus simple avec des quotes simples (surtout que "awk" utilise le "$" qui pourra foutre le bordel avec le shell si tu ne bloques pas son interprétation).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    #!/bin/bash
    new_ip="$(dig +short myip.opendns.com @resolver1.opendns.com)"
    if [ "$new_ip" = "$(cat current_ip.txt)" ]
    then 
    	echo "pas de changement ip"
    	exit 0
    fi
     
    echo "$new_ip" >current_ip.txt
    curl -X PUT "https://api.cloudflare.com/client/v4/accounts/**token de mon compte**/access/apps/**token de l'app**/policies/**token de la regle**" \
         -H "X-Auth-Email: moi@mail.com" \
         -H "X-Auth-Key: **Mon token d'identification**" \
         -H "Content-Type: application/json" \
         --data "{\"precedence\":1,\"decision\":\"bypass\",\"name\":\"IP\",\"include\":[{\"ip\":{\"ip\":\"$new_ip\"}}]}"
     
    echo "Mise à jour effectuée"
    Citation Envoyé par Rutsah Voir le message
    Est ce que ce genre de script est assez léger pour être lancé toutes les minutes (même si en vrai je pense plutôt le faire toutes les 10 ou 15 minutes ça me semble suffisant).
    Il est pas super lourd en tant que tel sauf le "dig" toutes les minutes qui peut être une charge un peu inutile. Si tu penses que 10 ou 15 minutes est un bon compromis alors pourquoi forcer? Tu le mets dans un "cron" et tu ne t'en occupes plus...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Candidat au Club
    Homme Profil pro
    Code pour le fun
    Inscrit en
    Septembre 2022
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Code pour le fun

    Informations forums :
    Inscription : Septembre 2022
    Messages : 3
    Par défaut
    Ok, merci pour tout tes bons conseils. Pour la fonction if je ne sais pas pourquoi mais je pensais que le else était obligatoire.
    J'étais déjà content simplement que ça fonctionne mais un code nettoyé et optimisé ça ne fait pas de mal, surtout que ça tournera sur un Raspberry (4 mais quand même).

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 652
    Par défaut UUOC!
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if [ "$new_ip" = "$(cat current_ip.txt)" ]
    Code /bin/bash : Sélectionner tout - Visualiser dans une fenêtre à part
    if [ "$new_ip" = "$(<current_ip.txt)" ]
    Code /bin/bash : Sélectionner tout - Visualiser dans une fenêtre à part
    if test "$new_ip" = "$(<current_ip.txt)"
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  7. #7
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    if [ "$new_ip" = "$(<current_ip.txt)" ]
    Comme toujours, tu penses à des trucs auxquels je ne pense pas
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  8. #8
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    #!/bin/bash
    echo "$new_ip" >current_ip.txt
    ...
    curl -X PUT "..." \
         --data "{\"precedence\":1,\"decision\":\"bypass\",\"name\":\"IP\",\"include\":[{\"ip\":{\"ip\":\"$new_ip\"}}]}"

    Citation Envoyé par N_BaH Voir le message
    Code /bin/bash : Sélectionner tout - Visualiser dans une fenêtre à part
    if [ "$new_ip" = "$(<current_ip.txt)" ]
    Juste une petite remarque à 2 balles en passant:
    le fichier "current_ip.txt" contient l'adresse ip courante, suivie d'un caractère de fin de ligne, car on a utilisé echo "$new_ip" et non echo -n "$new_ip" ou echo "$new_ip\c".
    Si je fais current_ip="$(cat current_ip.txt)"; echo ${#current_ip}, je constate que la variable ne contient PAS le (ou les) caractère de fin de ligne.

    Pourquoi ?

    Si je fais :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    echo -e "coucou\ncoucou">foo.txt
    od -c foo.txt
    foo="$(cat foo.txt)"
    echo ${#foo}
    j'obtiens 13 caractères, avec le \n intermédiaire, mais pas le final...

    Dois-je en conclure que seul le \n final n'est pas récupéré lorsque je mets le résultat du cat dans une variable ?

  9. #9
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par jack-ft Voir le message
    Si je fais current_ip="$(cat current_ip.txt)"; echo ${#current_ip}, je constate que la variable ne contient PAS le (ou les) caractère de fin de ligne.

    Pourquoi ?
    Intéressante question

    En effet...
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ echo "coucou" >fic
    $ wc -c fic
    7 fic
    $ v="$(<fic)"
    $ echo "[$v]"
    [coucou]
    $ echo "[$v]" |od -c
    0000000   [   c   o   u   c   o   u   ]  \n
    0000011
    L'hypothèse que je peux formuler, c'est que toutes les commandes de récupération de flux suppriment systématiquement le dernier '\n' si présent.

    Citation Envoyé par jack-ft Voir le message
    Dois-je en conclure que seul le \n final n'est pas récupéré lorsque je mets le résultat du cat dans une variable ?
    Ca me semble logique de le supposer. Mais pas que cat. Ce sera vrai aussi pour ls, pour wc, pour echo même (oui, bien que très con on peut remplacer v="123" par v="$(echo 123)") bref pour toutes les commandes qui affichent des lignes au final. Toutes les lignes seront bien reçues excepté la dernière qui sera privée de son '\n'. Probablement parce que ce '\n' est présumé être ensuite affiché via le echo "[$var]" qui fait généralement suite à la création de "var" ; ou plus simplement parce qu'il est présumé être gênant dans le traitement de l'info renvoyée par ladite commande (en partant du principe que dans la majorité des cas on ne récupère et on ne traite que des infos tenant sur une unique ligne)...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  10. #10
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Intéressante question
    N'est-elle pas ?

    En effet...
    L'hypothèse que je peux formuler, c'est que toutes les commandes de récupération de flux suppriment systématiquement le dernier '\n' si présent.
    Même que si y en a plus qu'un, c'est pareil:

    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ echo -e "coucou\n\n\n\n\n" >fic
    $ wc -c fic
          12 fic
    $ v="$(<fic)"
    $ echo "[$v]"
    [coucou]
    $ echo "[$v]" |od -c
    0000000   [   c   o   u   c   o   u   ]  \n
    0000011

    => les commandes de récupération de flux suppriment systématiquement les derniers '\n' si présents

    Par contre, les \n intermédiaires sont bien conservés.

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

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

    J'avais déjà remarqué que vim ne pouvait pas enregistrer un fichier texte sans ajouter un \n final. Certains vont dire qu'il est malsain de ne pas avoir de \n final. Cela contrevient à la norme POSIX. Certes, d'autres vont dire qu'une norme, ça se respecte, ou pas. Mais si on ne respecte pas. Comment fait-on pour savoir si la dernière ligne d'un fichier est celle terminée par \n, ou la ligne vide suivante qui n'est pas terminée par un \n ? Conclusion : il faut respecter la norme et proscrire les lignes sans \n final.

  12. #12
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Flodelarab Voir le message
    J'avais déjà remarqué que vim ne pouvait pas enregistrer un fichier texte sans ajouter un \n final.
    Euh si, si le fichier ouvert n'en contient pas à l'origine, il le dit (un message "[noeol]" affiché en bas de l'écran quand on ouvre le fichier) mais il ne le rajoute pas (et je n'ai pas trouvé de moyen de le lui faire mettre donc en général je tape ensuite echo >> fic en faisant super gaffe de bien mettre deux redirections ).
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  13. #13
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 347
    Par défaut
    Voici un effet de bord si pas de '\n' sur la dernière ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ unset a
    $ while read a ; do echo $a ; done < <(echo toto)
    toto
    $ unset a
    $ while read a ; do echo $a ; done < <(echo -n toto)
    $ echo $a
    toto
    donc le read a bien valorisé la variable "a" mais par contre il sort en erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ read a  < <(echo -n toto)
    $ echo $?
    1

  14. #14
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    donc le read a bien valorisé la variable "a" mais par contre il sort en erreur
    Bien vu
    Cela peut créer des soucis dans les scripts
    Code bashr : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while read ligne, do
        traitement "$ligne"
    done < <(commande)
    Si la dernière ligne ne contient pas de '\n', elle ne sera pas traitée. En même temps si la dernière ligne ne contient pas de '\n' elle ne correspond alors pas à la norme et étant hors norme, ne peut pas se plaindre d'être hors la loi hors traitement...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 288
    Par défaut
    Oui mais là, il y a encore une bizarrerie. read pourrait ne pas snober la dernière ligne au seule prétexte de sa fin. awk agit quand même :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ cat 4cocos 
    coco
    coco
    coco
    coco$ awk -vORS=P '1' 4cocos 
    cocoPcocoPcocoPcocoP$ while read ligne; do echo "pouet";done < 4cocos 
    pouet
    pouet
    pouet
    Il y a bien 4 enregistrements traités avec awk.

  16. #16
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 347
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 347
    Par défaut
    Ce n'est pas read qui la snob, car il a bien la valeur de la dernière ligne mais il sort en erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ while read a || [ -n "$a" ] ; do echo $a ; done < <(echo -ne "\ntoto\n\ntiti")
     
    toto
     
    titi

  17. #17
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Euh si, si le fichier ouvert n'en contient pas à l'origine, il le dit (un message "[noeol]" affiché en bas de l'écran quand on ouvre le fichier) mais il ne le rajoute pas (et je n'ai pas trouvé de moyen de le lui faire mettre donc en général je tape ensuite echo >> fic
    C'est pourtant pas bien compliqué...

    Si tu veux que ton éditeur mette systématiquement un newline quand tu sauves un fichier, il te suffit de customiser la variable require-final-newline et de la mettre à t (ou bien de mettre, à la mano, une ligne comme (setq-default require-final-newline t) dans ton "~/.emacs").
    Si tu veux qu'il te pose la question de l'ajouter ou non à la sauvegarde, il suffit de remplacer t par 'ask, par exemple: (setq-default require-final-newline 'ask).


    en général je tape ensuite echo >> fic en faisant super gaffe de bien mettre deux redirections ).
    C'est aussi pour éviter ce genre de risque que j'ai un set noclobber dans mon "~/.profile"

  18. #18
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 832
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 832
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par jack-ft Voir le message
    Si tu veux que ton éditeur mette systématiquement un newline quand tu sauves un fichier, il te suffit de customiser la variable require-final-newline et de la mettre à t (ou bien de mettre, à la mano, une ligne comme (setq-default require-final-newline t) dans ton "~/.emacs").
    Mouais. Mais comme 1) j'utilise "gvim" (issu de "vi" mentionné par Flodelarab à qui je répondais) et que 2) emacs ce n'est pas un éditeur...

    Citation Envoyé par jack-ft Voir le message
    C'est aussi pour éviter ce genre de risque que j'ai un set noclobber dans mon "~/.profile"
    Ah celle là je ne la connaissais pas
    Allez, adopté (et ça rattrape ta bourde concernant emacs )
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 652
    Par défaut
    emacs ce n'est pas un éditeur
    tout le monde n'est pas d'accord.
    Citation Envoyé par gnu.org
    GNU Emacs
    An extensible, customizable, free/libre text editor
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Utilisation d'une variable dans une requete
    Par namto dans le forum PL/SQL
    Réponses: 2
    Dernier message: 22/03/2010, 11h23
  2. utiliser des variables dans une requet INSERT
    Par k_boy dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 03/12/2009, 10h45
  3. Utiliser une variable dans une requete et *
    Par USnico dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 30/10/2007, 17h41
  4. utilisation d'une variable dans une requete SQL
    Par ezneti dans le forum Visual C++
    Réponses: 1
    Dernier message: 30/04/2007, 09h47
  5. utilisation de variable dans une requete
    Par JUSTIN Loïc dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 26/07/2006, 08h40

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