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 :

Adapter son script pour les pipelines


Sujet :

Shell et commandes GNU

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 29
    Points : 25
    Points
    25
    Par défaut Adapter son script pour les pipelines
    Bonjour tous et toutes !

    Je suis en Licence 1 Informatique et dans le cours d'Environnement Informatique, on apprend à faire des script et utiliser les systèmes GNU/Linux. Sinon, ça fait 2 ans que je bidouille un peu sous Debian et Ubuntu.

    Voici les explications de mes soucis :

    Considérons un script bidon qui prend un nom de fichier en paramètre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #! /bin/csh
     
    #monscript
     
    if ( -e $1 ) then
        cat $1 | tr "/" ":"
    endif
    Résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    nom@machine:~$ cat test.txt
    /je/suis/sur/linux
    nom@machine:~$ ./monscript.sh test.txt
    :je:suis:sur:linux
    nom@machine:~$
    Comment dois-je l'adapter pour qu'il fonctionne de cette manière (et qu'il fonctionne également comme au départ) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    nom@machine:~$ pwd | ./monscript.sh
    :home:nom
    nom@machine:~$
    Sinon, une dernière petite question : (vous aurez remarqué que c'est du CSH et pas du SH) comment fait-on pour accéder à la case n° i-1 d'un tableau ?
    J'ai essayé plusieurs syntaxes sans succès, j'ai dû passer par une variable tmp = $i -1 et c'est moche.

    Vous conviendrez que l'utilité de ce script est critiquable, mais mon but c'est de savoir comment faire, puis de l'appliquer sur mes scripts.

    Sinon, j'ai remarqué que le csh est assez chiant au niveau débogage, j'ai pas mal galéré sur des détails. Du coup, j'aimerais aussi savoir comment on fait en sh/bash.

    Merci d'avance !

  2. #2
    Membre habitué
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Décembre 2013
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Analyste d'exploitation

    Informations forums :
    Inscription : Décembre 2013
    Messages : 70
    Points : 159
    Points
    159
    Par défaut
    Salut,
    En bash :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ cat ./test.sh
    #!/bin/bash
    flux=${1:--}
    cat "$flux" | tr "/" ":"
     
    $ cat test.txt
    /je/suis/sur/linux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ ./test.sh test.txt
    :je:suis:sur:linux
     
    $ # pwd | ./test.sh
    :tmp:test

  3. #3
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    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 690
    Points : 30 986
    Points
    30 986
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par loukiluk Voir le message
    Considérons un script bidon qui prend un nom de fichier en paramètre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    #! /bin/csh
     
    #monscript
     
    if ( -e $1 ) then
        cat $1 | tr "/" ":"
    endif
    Résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    nom@machine:~$ cat test.txt
    /je/suis/sur/linux
    nom@machine:~$ ./monscript.sh test.txt
    :je:suis:sur:linux
    nom@machine:~$
    Comment dois-je l'adapter pour qu'il fonctionne de cette manière (et qu'il fonctionne également comme au départ) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    nom@machine:~$ pwd | ./monscript.sh
    :home:nom
    nom@machine:~$
    Salut
    Postmortem t'a donné une solution possible. Bien entendu il y en a d'autres.

    Petite explication: en utilisant $1 tu impliques la présence d'un argument positionnel (l'élément placé après le nom du script) que tu vas traiter.

    Si tu veux pouvoir passer quelque chose en entrée standard, il faut alors demander à ton script de traiter cette entrée standard (symbolisée généralement par "-"). La syntaxe de Postmortem flux=${1:--} remplit une variable "$flux" avec la variable $1 si celle-ci existe et est non vide sinon avec cette chaine "-" (syntaxe :-) . Puis il récupère le contenu de $flux qu'il envoie à tr.

    Un script équivalent mais plus détaillé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #!/bin/bash
    if test -s "$1"
    then
        flux="$1"
    else
        flux="-"
    fi
    cat "$flux" | tr "/" ":"
    Et un autre utilisant un autre outil
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    #!/bin/bash
    test -s "$1" && flux="$1" || flux="-"
    cat "$flux" | tr "/" ":"
    Maintenant la syntaxe ${var:-valeur_autre} étant la plus condensée de toutes et tout aussi efficace, autant utiliser cette dernière...

    Citation Envoyé par loukiluk Voir le message
    Sinon, une dernière petite question : (vous aurez remarqué que c'est du CSH et pas du SH) comment fait-on pour accéder à la case n° i-1 d'un tableau ?
    J'ai essayé plusieurs syntaxes sans succès, j'ai dû passer par une variable tmp = $i -1 et c'est moche.
    Je ne connais pas du tout csh mais je pense que le problème est le même qu'en Bourne Shell: en effet, celui-ci ne sait pas faire d'opérations mathématiques. Or quand on a besoin d'opérations de ce genre, il faut alors la déléguer à un programme spécialisé qui effectue l'opération (comme par exemple "bc" ou "expr") puis récupèrer le résultat affiché par la commande et l'intégrer dans le script.
    Exemple d'incrément de variable en Bourne Shell
    Code sh : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    #!/bin/sh
    i=5
    i=`expr $i + 1`      # appel du programme externe "expr" puis intégration du résultat affiché par ce programme (ici "6") dans le script => c'est comme s'il était écrit i=6
    echo $i

    Donc si je veux adapter ce système aux tableaux et afficher la i-i case, il me faut faire un truc de ce genre: echo ${tab[`expr $i - 1`]}.
    La syntaxe `programme` étant peu parlante, il lui a été ajouté la syntaxe équivalente $(programme) plus explicite. On peut alors adapter et écrire: echo ${tab[$(expr $i - 1)]}...
    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]

  4. #4
    Membre habitué
    Homme Profil pro
    Analyste d'exploitation
    Inscrit en
    Décembre 2013
    Messages
    70
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Analyste d'exploitation

    Informations forums :
    Inscription : Décembre 2013
    Messages : 70
    Points : 159
    Points
    159
    Par défaut
    @Sve@r : j'aurais du prendre le temps de donner l'explication
    Mais bon, je l'aurais pas faite aussi claire !
    Merci de l'avoir fait !

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2011
    Messages : 29
    Points : 25
    Points
    25
    Par défaut
    Merci beaucoup pour vos réponses, elles répondent parfaitement à mon problème... en sh. Je n'ai donc pas la réponse en csh, tant pis pour moi xD
    C'est pas grave, puisque dans le projet à rendre, on est pas sensé savoir faire ce que j'aimerais faire et plus tard, j'éviterai le csh. J'ai trop galéré avec ses erreurs inexplicites au possible et de toute façon, j'ai plusieurs personnes qui me l'ont déconseillé et qui préfèrent sh.
    Dernière petite question, y'a-til une différence entre sh et bash ?

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 690
    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 690
    Points : 30 986
    Points
    30 986
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Postmortem Voir le message
    Merci de l'avoir fait !
    J'aime bien expliquer les trucs. Mais c'est bizarre, j'ai pas eu de retour de ce topic sur mon tableau de bord. Je n'ai eu de retour qu'au post de loukiluk. Peut-être un petit bug du new fofo..

    Citation Envoyé par loukiluk Voir le message
    Dernière petite question, y'a-til une différence entre sh et bash ?
    Oh là là oui !!!
    Le sh c'est le Bourne Shell (shell inventé par Steve Bourne). C'est le tout premier. Ensuite d'autres ont vu le jour, un peu/beaucoup différents (csh, jsh, ksh, ...). Et une des caractéristiques commune à tous les autres c'est qu'ils avaient tous des outils en plus parce que leurs inventeurs les trouvaient utiles et trouvaient qu'ils manquaient au sh.
    Voyant cela, Brian Fox, un employé de la FSF, a décidé de créer sa propre version intégrant lui-aussi des améliorations qu'il trouvait utile mais en gardant une compète compatibilité Bourne shell. Ce qui a donné le Bourne Again Shell => bash

    Exemples d'améliorations:
    • complétion de commandes (en mode terminal)
    • possibilité de tableaux
    • rajout de la syntaxe $(commande) plus parlante que `commande` et permettant des imbrications plus facile => $(commande1 $(commande2)) en remplacement de `commande1 \`commande2\``. La syntaxe d'origine `commande` est quand-même conservée pour compatibilité avec sh
    • calculs possibles sur les valeurs numériques
    • possibilité d'empiler les diffrents répertoires dans lesquels on se positionne successivement (utilisation de pushd rep en remplacement de cd rep) pour pouvoir y revenir ensuite dans l'ordre inverse (popd). Si on va dans rep1 puis dans rep2 puis en final dans rep3 alors chaque popd fera revenir dans rep2 puis dans rep1

    Et plein d'autres que j'ai pas en tête.

    Et gros avantage, Brian Fox ayant voulu une compatibilité totale, un ancien script sh fonctionnera aussi sous bash.
    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]

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 392
    Points
    19 392
    Par défaut
    Bonjour,

    Citation Envoyé par loukiluk
    Dernière petite question, y'a-til une différence entre sh et bash ?
    Qu'est-ce que GNU : Bash - l'interpréteur de commande GNU, par Chet Ramey : partie 1 - partie 2

    en cherchant «the linux journal what's gnu bash» sur Google, ce dernier vous propose d'afficher une traduction approximative.
    .
    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. Adapter son site pour s'afficher sur les portables
    Par ptityop dans le forum Développement Web avec .NET
    Réponses: 2
    Dernier message: 14/08/2010, 00h30
  2. script pour les profil itinerant?
    Par delphino7 dans le forum Windows Serveur
    Réponses: 0
    Dernier message: 31/03/2008, 13h48
  3. Adapter un script, pour IE et Firefox
    Par yelo31 dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 15/01/2007, 23h02
  4. Réponses: 10
    Dernier message: 17/08/2006, 22h27
  5. Script pour les infos système
    Par soulhouf dans le forum Linux
    Réponses: 14
    Dernier message: 12/04/2006, 16h03

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