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 shell qui crée un autre script shell


Sujet :

Shell et commandes GNU

  1. #1
    Candidat au Club
    Homme Profil pro
    Administrateur CAO
    Inscrit en
    Octobre 2016
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Administrateur CAO
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2016
    Messages : 4
    Points : 2
    Points
    2
    Par défaut Script shell qui crée un autre script shell
    Bonjour

    J'ai écrit un script qui en fonction des variables d'entrée, créé un autre script, puis l'execute.

    Le script est le suivant:
    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
    19
    20
     
    #! /bin/sh
    DIRECTORY=/work
    ID_JOB=test
    PRIORITY=Highest
     
     
    cd $DIRECTORY
     
     
    for listejob in `cat /work/liste.txt`; do
       FILENAME=`basename "$listejob" .txt`
       echo '#!/bin/sh' > "$FILENAME".sh
       echo 'ligne... >> "$FILENAME".sh
       echo 'ligne... >> "$FILENAME".sh
             ...
       echo 'variable=`/usr/bin/uniq -c ${toto} | /usr/bin/head -1 | /bin/awk '{ print $1 }'`' >> "$FILENAME".sh
             ...
    done
    echo fin
    Mon soucis se situe au niveau de cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo 'variable=`/usr/bin/uniq -c ${toto} | /usr/bin/head -1 | /bin/awk '{ print $1 }'`' >> "$FILENAME".sh
    j'obtiens dans le fichier FILENAME.sh

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    variable=`/usr/bin/uniq -c ${toto} | /usr/bin/head -1 | /bin/awk { print $1 }`
    Or je souhaiterais avoir:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    variable=`/usr/bin/uniq -c ${toto} | /usr/bin/head -1 | /bin/awk '{ print $1 }'`
    Si vous avez des suggestions pour ce cas présent, merci beaucoup pour votre retour.
    A votre disposition pour tout complément.

    Jérôme

  2. #2
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 563
    Points : 460
    Points
    460
    Par défaut
    Salut, perso, quand je veux envoyer plein de " et ' dans un fichier, j'utilise cat et je protège les $
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    cat << EOF >> "$FILENAME".sh
    variable=\$(/usr/bin/uniq -c \${toto} | /usr/bin/head -1 | /bin/awk '{ print \$1 }')
    EOF
    Et on utilise $() et non plus ``.


    EDIT :
    Beurk :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    for listejob in `cat /work/liste.txt`; do
       FILENAME=`basename "$listejob" .txt`
       echo '#!/bin/sh' > "$FILENAME".sh
       echo 'ligne... >> "$FILENAME".sh
       echo 'ligne... >> "$FILENAME".sh
             ...
       echo 'variable=`/usr/bin/uniq -c ${toto} | /usr/bin/head -1 | /bin/awk '{ print $1 }'`' >> "$FILENAME".sh
             ...
    done
    =>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    while read listejob # Pourquoi faire une substitution ?
    do
      FileName="${listejob##*/} .txt" # Pourquoi encore faire une substitution ?
      cat << EOF > "${FileName}.sh"
    #!/bin/sh
    ligne... 
    ligne... 
    ...
    variable=\$(/usr/bin/uniq -c \${toto} | /usr/bin/head -1 | /bin/awk '{ print \$1 }')
    ...
    EOF
    done < "/work/liste.txt"
    Pourquoi utiliser x echo ? A part à perdre du temps (surtout lors de l'écriture) et à alourdir le code ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    time for ((x=1; x < 100000; x++)); do echo "oui"; echo "non"; echo "je sais pas"; done
    real    0m2,943s
    user    0m2,078s
    sys     0m0,864s
     
    time for ((x=1; x < 100000; x++)); do echo -e "oui\nnon\nje sais pas"; done
    real    0m1,864s
    user    0m1,250s
    sys     0m0,593s
    Sous Kubuntu 20.04

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 376
    Points
    19 376
    Par défaut
    ou, on ne protège pas les $, mais on met le eof entre apostrophes.

    sinon :
    - les noms de variables en majuscules sont reservés aux variables d'environnement; les utilisateurs peuvent utiliser un panachage :varName,
    - on ne lit pas un fichier comme ça, mais comme ça,
    - et, comme l'a montré hizoka, on n'utilise plus ` depuis bien longtemps.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  4. #4
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 563
    Points : 460
    Points
    460
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    ou, on ne protège pas les $, mais on met le eof entre apostrophes.
    Merci ! Carrément plus pratique !!!
    Ça valait vraiment le coup que je réponde
    Sous Kubuntu 20.04

  5. #5
    Candidat au Club
    Homme Profil pro
    Administrateur CAO
    Inscrit en
    Octobre 2016
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Administrateur CAO
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2016
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Merci pour vos retours et remarques.
    Je vais adapter cela à mon projet (du moins essayer )
    Par contre, j'ai oublié de préciser que durant la création du second script FILENAME.sh, des variables (issue du script initial) seront écrites dans celui-ci.

    j'ai donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo 'SBATCH --qos='$priority >> "$FILENAME".sh
    (j'ai volontairement laisser ma synthaxe initiale)

    Pour obtenir dans FILENAME.sh :

    Cela change quelque chose compte tenu de vos commentaires?

    Encore merci pour vos apports

  6. #6
    Expert éminent sénior
    Avatar de Escapetiger
    Homme Profil pro
    Administrateur système Unix - Linux
    Inscrit en
    Juillet 2012
    Messages
    1 474
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Administrateur système Unix - Linux

    Informations forums :
    Inscription : Juillet 2012
    Messages : 1 474
    Points : 11 041
    Points
    11 041
    Par défaut
    Citation Envoyé par hizoka Voir le message
    Et on utilise $() et non plus ``.
    Citation Envoyé par N_BaH Voir le message
    - et, comme l'a montré hizoka, on n'utilise plus ` depuis bien longtemps.
    Oui, et on voit parfois des scripts anciens chez des clients qui l'utilisent encore (moi-même parfois par mauvaise habitude dans un premier temps).

    C'est toujours intéressant de savoir pourquoi :

    bash - What is the difference between $(command) and `command` in shell programming? - Stack Overflow

    Why is $(...) preferred over `...` (backticks)? BashFAQ/082 - Greg's Wiki

    bash - Have backticks (i.e. `cmd`) in *sh shells been deprecated? - Unix & Linux Stack Exchange

    etc,
    « Developpez.com est un groupe international de bénévoles dont la motivation est l'entraide au sens large » (incl. forums developpez.net)
    Club des professionnels en informatique

  7. #7
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 563
    Points : 460
    Points
    460
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo 'SBATCH --qos='$priority >> "$FILENAME".sh
    =>
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo "SBATCH --qos=$priority" >> "$FILENAME".sh
    du coup, il ne faut pas utiliser 'EOF' mais EOF et protéger les $ qui en ont besoin.

    ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    cat << EOF > fichier # EOF pour End Of File mais tu peux écrire ce que tu veux
    echo "regarder ma belle variable ${variable}, et la voila la variable non convertie \${variable}"
    EOF
    Mais peut être vais je apprendre une autre façon de faire
    Sous Kubuntu 20.04

  8. #8
    Candidat au Club
    Homme Profil pro
    Administrateur CAO
    Inscrit en
    Octobre 2016
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Administrateur CAO
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2016
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Bonjour

    Depuis vos dernières réponses, j'ai pris le temps de lire vos commentaires et les différents lien proposés.
    J'ai donc ré-écris le script en fonction de vos remarques (suppression des echo et des ``) .

    Néanmoins je bloque sur certains passages.

    Voici la partie de mon script qui me pose des problèmes de mise en forme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    cat << fincat > "${FileName}.sh"
    #!/bin/sh
    ...
    for NODE in `/usr/bin/uniq \$TOTALCAE_NODEFILE`; do
       mp_host_list="\$mp_host_list[\"\${NODE}\",\${PROCS_PER_NODE}],"
    done
    export mp_host_list=`echo \${mp_host_list} | sed -e "s/,$/]/"`
    ...
    fincat
    J'obtiens ceci dans mon fichier, mes problèmes sont au niveau des ligne "for" et "export" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for NODE in ; do
       mp_host_list="$mp_host_list[\"${NODE}\",${PROCS_PER_NODE}],"
    done
    export mp_host_list=
    Or je cherche a avoir ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for NODE in `/usr/bin/uniq $TOTALCAE_NODEFILE`; do
       mp_host_list="$mp_host_list[\"${NODE}\",${PROCS_PER_NODE}],"
    done
    export mp_host_list=`echo ${mp_host_list} | sed -e "s/,$/]/"`
    Les commandes entre les `` sont interprétées par le script de base.
    Avez vous des idées et pourrait-on supprimer les `` dans ces deux cas précis.
    En effet, pour le fichier sh que j'obtiens, les commande devront, par contre, être interprétées.

    J'ai trituré ce passage dans tous les sens à partir de vos remarques précédentes mais sans résultats.

    Merci pour votre retour.

  9. #9
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Novembre 2013
    Messages
    563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 563
    Points : 460
    Points
    460
    Par défaut
    heu.... remplace les `` par $().... puis échappe le $...
    en gros c'est ce qu'on à déjà dit :p

    mais comme signalé, si tu utilises cat << 'EOF', tu n'a plus besoin d'échapper les $ (mais aucune variable n'est plus interprétée).
    Sous Kubuntu 20.04

  10. #10
    Candidat au Club
    Homme Profil pro
    Administrateur CAO
    Inscrit en
    Octobre 2016
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Administrateur CAO
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2016
    Messages : 4
    Points : 2
    Points
    2
    Par défaut
    Effectivement, je me focalisais sur la forme résultante et j'ai totalement oublié l’exécution futur du script.
    Après modifications, le script généré semble fonctionner. il ne reste plus qu'à le mettre en page.

    Merci beaucoup pour votre aide.

    Bonne fêtes de fin d'années.

    Jérôme

  11. #11
    Membre éclairé Avatar de srvremi
    Homme Profil pro
    Directeur d'école d'ingénieurs
    Inscrit en
    Mars 2002
    Messages
    554
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Directeur d'école d'ingénieurs
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2002
    Messages : 554
    Points : 656
    Points
    656
    Par défaut
    Salut.

    Je ne connaissais pas le coup du
    Cool !

    @+
    Rémi

  12. #12
    Modérateur
    Avatar de ggnore
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 472
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 472
    Points : 4 029
    Points
    4 029
    Par défaut
    Sinon ansible c'est une approche un peu moins roots.
    Toutes les vertus des hommes se perdent dans l’intérêt comme les fleuves se perdent dans la mer.
    N'oubliez pas de consulter les FAQ Linux et les cours et tutoriels Linux

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 08/03/2010, 14h36
  2. un script shell qui appel un autre
    Par nina08 dans le forum Linux
    Réponses: 22
    Dernier message: 19/11/2009, 01h20
  3. Réponses: 7
    Dernier message: 15/09/2009, 18h44
  4. script batch qui lance un autre script
    Par princesse95 dans le forum Scripts/Batch
    Réponses: 5
    Dernier message: 01/12/2008, 17h01
  5. Script perl qui exécute d'autres scripts perl
    Par LFC dans le forum Langage
    Réponses: 1
    Dernier message: 21/07/2006, 18h54

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