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 :

Script avec 2 arguments récupérés dans un fichier


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Analyse système
    Inscrit en
    Août 2020
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2020
    Messages : 160
    Par défaut Script avec 2 arguments récupérés dans un fichier
    Bonsoir,

    Je souhaiterais faire passer un script plusieurs fois avec 2 arguments $1 et $2 que je récupère dans un fichier, je m'explique:

    Fichier contenant les arguments :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    toto1 toto2
    tata1 tata2
    titi1 titi2
    Premier passage du script :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ./monscript.sh toto1 toto2
    Second passage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ./monscript.sh tata1 tata2
    Troisième passage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ./monscript.sh titi1 titi2
    Avec un seul argument, une boucle while (ci-dessous) répond très bien au problème, mais avec le besoin cité ci-dessus (les 2 arguments que l'on récupère sur la même ligne) j'avoue que je galère.

    Pour un argument :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while read i; do echo $i; ./monscript.sh $i; done < argument_file.txt
    Auriez-vous une idée ? Merci.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 713
    Par défaut
    ah, mais tu vas finir par aller le lire ce petit tuto de la FAQ. la FAQ!

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

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

    Je m'auto-cite avec une discussion sur le même titre qui date de quelques jours.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while read a b c
    do
        echo "Premier argument : $a"
        echo "Deuxième argument : $b"
    done < fichier.txt

  4. #4
    Membre confirmé
    Homme Profil pro
    Analyse système
    Inscrit en
    Août 2020
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2020
    Messages : 160
    Par défaut
    Merci pour ta réponse. Oui je l'ai lu avec attention, il y a pas mal de choses très utiles.

    Finalement dans ma situation, qu'il y ait un argument ou deux c'est pareil du moment qu'ils sont sur la même ligne et qu'ils sont séparés par un espace :

    fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    toto1 toto2
    tata1 tata2
    titi1 titi2
    Ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while read Ligne
    do echo "$Ligne"
    done < fichier
    ..... donnera la 1ère ligne, la seconde puis la 3ème.

    Donc :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    while read Ligne
    do ./script.sh $Ligne
    done < fichier
    ..... donnera bien :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ./script.sh toto1 toto2
    ./script.sh tata1 tata2
    ./script.sh titi1 titi2
    L'avis du maestro ?

  5. #5
    Membre confirmé
    Homme Profil pro
    Analyse système
    Inscrit en
    Août 2020
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2020
    Messages : 160
    Par défaut
    Je réponds à Flodelarab, merci.

    Concernant ton code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    while read a b c
    do
        echo "Premier argument : $a"
        echo "Deuxième argument : $b"
    done < fichier.txt
    Si fichier.txt est celui que j'ai explicité dans mon 1er message, à savoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    toto1 toto2
    tata1 tata2
    titi1 titi2
    Il faudrait écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while read a b c
    do
        ./script.sh $a $b
    done < fichier.txt
    .... et ainsi cela produirait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ./script.sh toto1 toto2
    ./script.sh tata1 tata2
    ./script.sh titi1 titi2
    Là comme ça cela ne me paraît pas trivial, j'ai pas le matos pour tester.. mais cela donnerait bien ça ?

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 713
    Par défaut
    read va assigner autant de variables qu'il lui est fourni de noms de variables et qu'il y a de mots (au sens de "champs". cf. IFS (Internal Field Separator))

    l'IFS doit être défini localement pour read s'il diffère de la valeur par défaut (espace tabulation alinéa ( ' '* \t \n)).
    * j'ai mis des apostrophes pour rendre l'espace visible, sinon le forum ne le montre pas.

    soit une ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ ligne='abc:def:ghi:jkl'
    pour assigner une variable pour chaque mot séparé par :, on utilisera la commande suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ IFS=':' read un deux reste <<<"$ligne"
    je te laisse tester le résultat.

    en bash on peut lire dans un tableau sans avoir à se soucier du nombre d'éléments :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ IFS=':' read -a array <<<"$ligne"
    les tableaux sont indexés (par défaut. Mais, il peuvent aussi être associatifs en les déclarant explicitement différemment.) en débutant à 0.

  7. #7
    Membre confirmé
    Homme Profil pro
    Analyse système
    Inscrit en
    Août 2020
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2020
    Messages : 160
    Par défaut
    Merci pour ce message top niveau. Je réfléchis pour le rapprocher de ma situation : mon fichier 3 lignes 2 colonnes.

  8. #8
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 408
    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 408
    Par défaut
    Une autre méthode en une ligne:
    Le script bash:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ cat /tmp/sc.sh 
    #!/usr/bin/bash
    echo "arg2=$2 & arg1=$1"
    Le fichier avec les arguments:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ cat /tmp/ficarg 
    toto1 toto2
    tata1 tata2
    titi1 titi2
    La commande sur une ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ xargs -a /tmp/ficarg -L 1 /tmp/sc.sh 
    arg2=toto2 & arg1=toto1
    arg2=tata2 & arg1=tata1
    arg2=titi2 & arg1=titi1

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 713
    Par défaut
    dis-nous, disedorgue, et si le séparateur n'est pas un espace ?

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

Discussions similaires

  1. [XSLT]Probléme avec une fonction php dans un fichier xsl!
    Par Mo_Poly dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 29/10/2007, 08h32
  2. Réponses: 2
    Dernier message: 07/04/2007, 12h29
  3. Réponses: 9
    Dernier message: 16/11/2006, 16h23
  4. Script CGI(impossible d'ecrire dans un fichier)
    Par matt8-5 dans le forum Web
    Réponses: 3
    Dernier message: 16/06/2006, 11h47
  5. Réponses: 8
    Dernier message: 24/11/2005, 04h53

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