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 657
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 657
    Par défaut
    ah, mais tu vas finir par aller le lire ce petit tuto de la FAQ. la FAQ!
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    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

    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 657
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 657
    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.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  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 348
    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 348
    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 657
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 657
    Par défaut
    dis-nous, disedorgue, et si le séparateur n'est pas un espace ?
    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. [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, 07h32
  2. Réponses: 2
    Dernier message: 07/04/2007, 11h29
  3. Réponses: 9
    Dernier message: 16/11/2006, 15h23
  4. Script CGI(impossible d'ecrire dans un fichier)
    Par matt8-5 dans le forum Web
    Réponses: 3
    Dernier message: 16/06/2006, 10h47
  5. Réponses: 8
    Dernier message: 24/11/2005, 03h53

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