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 :

Un mystère de comptage pour éliminer "ls"


Sujet :

Shell et commandes GNU

  1. #21
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 875
    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 875
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Jipété Voir le message
    qui ne m'avance absolument pas, ne voyant pas du tout de quoi on parle : quels arguments restants ? Quels paramètres de position ?
    Quand tu crées un programme pour qu'il effectue une tâche, tu peux le prévoir pour que les élements nécessaire à sa tâche lui soient passés lors de l'appel. Exemple le programme "cp" recevra deux éléments de travail: la source et la destination.
    Ces éléments sont passés après le nom du programme et avant le <return>. On les nommes "arguments du programme" => cp toto titi.

    Du côté programme, ces élements sont stockés dans des variables numérotées "$1", "$2", "$3", etc. qu'on nomme "paramètres de position" de par l'évidente corrélation entre les numéros des variables (1, 2, 3, etc) et la liste des arguments reçu (premier, second, troisième, etc). Ainsi dans l'exemple, "$1" contient "toto" et "$2" contient "titi". Plus "$#" qui contient le nombre d'arguments (ici 2), plus "$*" qui contient tous les arguments sous forme de chaine unique (donc "toto titi") et "$@" qui contient tous les arguments sous forme de chaines individuelles (donc "toto" "titi"). Plus "$0" qui contient le nom du programme tel qu'il a été invoqué en ligne de commande (ici "cp")
    Ce stockage est automatique. C'est bash qui le fait lors de l'appel.

    La commande set permet de réaffecter manuellement toutes ces variables. Si par exemple tu tapes l'instruction set xxx yyy zzz alors avant l'instruction tu as "$1" qui contient "toto", après l'instruction tu as "$1" qui contient "xxx" (et pareil pour tous les autres). Sauf "$0" qui reste inchangé.

    Ca peut être utile par exemple pour explorer ton chemin pwd. Tu tapes IFS=/ set "$(pwd)" et tu as tout ton pwd explosé dans $1, $2, $3, etc...
    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]

  2. #22
    Invité
    Invité(e)
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ (IFS='/' set -- "$(pwd)"; printf '%s\n' "$@")
    /home/nbah

  3. #23
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 875
    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 875
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    /home/nbah
    Oui, tu as raison. J'ai écrit cet exemple en partant d'un de mes codes mais j'ai voulu l'adapter à une syntaxe que j'ai apprise récemment dans laquelle on écrit var=valeur instruction et dans laquelle la variable n'existe que pour l'instruction.
    Donc je l'ai tapée sans la tester, en partant du principe que ça allait fonctionner puisqu'elle me semblait similaire à celle de mon code. Or après examen/test effectivement elle ne fonctionne pas.

    Voici un exemple créé à partir de mon code d'origine qui, lui, fonctionne
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #!/bin/bash
     
    oldifs="$IFS"
    IFS="/"
    set $(pwd)
    IFS="$oldifs"
     
    echo "[$1]"
    echo "[$2]"
    echo "[$3]"

    Et si on shunte maintenant la phase "sauvegarde puis restauration de l'IFS" en raccourcissant tout ça via un IFS=/ set $(pwd) ça ne fonctionne plus. Je ne peux que dire "désolé je ne sais pas pourquoi" mais c'est un peu de ta faute, c'est toi qui m'a appris var=valeur instruction

    Bon enfin c'est pas vraiment grave, l'important c'est que Jipété comprenne l'idée que mon exemple a voulu exprimer.

    PS: a noter aussi que si on remplace set $(pwd) par set "$(pwd)" là non plus ça ne fonctionne pas. Ok là c'est ma faute, j'ai voulu appliquer mes principes de quoter systématiquement toute string mais il semble que ça s'accorde mal avec l'IFS (et les quotes n'y sont d'ailleurs pas dans mon code d'origine )

    PS2: le code en question est disponible sur ce forum... https://frederic-lang.developpez.com...divers#LXIII-I

    PS3: en fait je pense que je n'ai pas compris var=valeur instruction car quand je tape toto=123 echo "[$toto]" j'obtiens "[]"
    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. #24
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 430
    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 430
    Par défaut
    IFS = Input Field Separator

    Donc, pour des commandes internes au shell qui ne prennent pas de données en entrée (le cas de set), ça ne fonctionne pas, faut que la variable soit changée pour le shell en lui même car c'est lui qui prend l'entrée pour fournir les paramètres à la commande.

    Cela fonctionne pour "read" car lui attend bien quelque chose en entrée.

    Question: pourquoi "$(pwd)" et pas la variable "$PWD" ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. cherche commande unix pour éliminer les données communes
    Par astrolane dans le forum Applications et environnements graphiques
    Réponses: 3
    Dernier message: 07/12/2009, 17h23
  2. [MySQL] Requête pour éliminer les enregistrements NULL
    Par gtraxx dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 12/03/2009, 09h09
  3. audacity pour éliminer le bruit
    Par zhpipo16 dans le forum Audio
    Réponses: 5
    Dernier message: 16/04/2008, 20h56
  4. Pb pour éliminer les caractères alpha
    Par chouffe dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 08/12/2005, 11h59

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