Précédent   Forum des professionnels en informatique > Systèmes > Linux > Applications > Shell
Shell Vos questions sur l'utilisation des commandes shell
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 14/09/2011, 11h36   #1
Candidat au titre de Membre du Club
 
Inscription : septembre 2011
Messages : 6
Détails du profil
Informations forums :
Inscription : septembre 2011
Messages : 6
Points : 12
Points : 12
Par défaut Script bash - boucle lecture arguments

Bonjour,


Débutant en script bash, je ne sais comment faire une partie de mon script !!!

Je souhaite lancer un script avec un menu (ok)...... demander à un moment à l'utilisateur d'indiquer plusieurs noms de répertoires, et effectuer un certain nombre d'action en fonction du nombre et des noms.
Ex: Si l'utilisateur indique 1 répertoire alors lancer la commande X, si 2 répertoires indiqués alors lancer 2 fois la commande X.......
C'est donc une boucle sur le nombre d'arguments passés mais ....?

Merci d'avance
Bonne journée
Cordialement
jffskyx est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 14/09/2011, 12h47   #2
Expert Confirmé Sénior
 
Avatar de Sve@r
 
Homme Frédéric
Ingénieur développement logiciels
Inscription : février 2006
Messages : 3 055
Détails du profil
Informations personnelles :
Nom : Homme Frédéric
Âge : 44
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 : 3 055
Points : 4 934
Points : 4 934
Salut

Tu confonds les notions. Les arguments c'est les éléments passés au programme lors de son appel (les mots qu'on rajoute dans la ligne de commande).
Or toi, tu poses une question et tu attends la réponse. Ce ne sont pas des arguments mais une réponse.

Voici pour traiter les arguments
Code bash :
1
2
3
4
5
6
#!/bin/sh
for rep in $*
do
    echo "Je traite le répertoire $rep"
    commandeX
done

Et voici pour demander et traiter la réponse
Code bash :
1
2
3
4
5
6
7
8
#!/bin/sh
echo "Entrez un ou plusieurs répertoires"
read info
for rep in $info
do
    echo "Je traite le répertoire $rep"
    commandeX
done
__________________
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Tout ce qu'un individu reçoit sans rien faire pour l'obtenir, un autre individu a dû travailler pour le produire sans en tirer profit.
Tout Pouvoir ne peut distribuer aux uns que ce qu'il a préalablement confisqué à d'autres car on n'accroît pas les biens en les divisant.
Quand la moitié d'un peuple croit qu'il ne sert à rien de faire des efforts car l'autre moitié les fera pour elle, et quand cette dernière moitié se dit qu'il ne sert à rien d'en faire car ils bénéficieront à d'autres, cela s'appelle le déclin et la fin d'une nation.
Dr. Adrian Rogers, 1931
Sve@r est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 14/09/2011, 13h36   #3
Candidat au titre de Membre du Club
 
Inscription : septembre 2011
Messages : 6
Détails du profil
Informations forums :
Inscription : septembre 2011
Messages : 6
Points : 12
Points : 12
Bonjour,

Merci pour votre réponse !
Par contre, je viens de tester mais ne comprends pas exactement la mise en œuvre par rapport à mon script.(sachant qu'il peut y avoir 1 réponse par l'utilisateur mais aussi X réponses dont on ne connait pas le nombre avant et donc que ces réponses serviront

Je mets la partie concernée ci dessous !!!

Code :
1
2
3
4
5
6
echo "$choix. demande des informations supp"
  cd /XXX/YYY/
     echo "Voici la liste des portlets disponibles"
     ls -F|grep @$ | awk -F@ '{print $1}'
     echo "indiquer le nom du(des) fichiers war"
        read REPONSEWAR
.......
....... ici plusieurs commandes à lancer obligatoire avant!
......
puis la partie....
............
Code :
1
2
3
4
5
6
echo "deploiement de $REPONSEWAR en cours"
        for rep in $REPONSEWAR
        do
        /usr/bin/ant portlet.deploy -DportletApp=/XXX/$REPONSEWAR.war
        rm -rf Portail/webapps/$REPONSEWAR/WEB-INF/lib/portlet-api-1.0.jar 
        done
.......
....puis d'autres commandes ....
.......

Pour 1 réponse cela fonctionne correctement !!!!
Par contre, le ant portlet.deploy ne fonctionne pas avec plusieurs réponses.....!!!!

Merci d'avance pour votre aide et vos conseils.
Bonne journée
jffskyx est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 14/09/2011, 15h01   #4
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 071
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 071
Points : 4 154
Points : 4 154
Bonjour,

en tant que membre de la 'fondation anti LS dans les scripts',
et de la 'fondation anti `grep | awk`', je me dois de dire que ls -F | grep @$ | awk ..., c'est pas possible !

read lit sur l'entrée standard jusqu'à (sauf indication contraire) ce qu'on appuie sur la touche entrée.
Si les indications à prendre en compte, qui sont fournies par l'utilisateur ne contiennent pas d'espaces, une boucle for devrait fonctionner.
Sinon, il faut envisager l'emploi d'une boucle while :
Code :
1
2
3
4
5
6
7
while read reponse
do if [ -n "$reponse" ]
   then echo "Traitement $reponse"
        #...
   else break
   fi
done
en gros.
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 15/09/2011, 12h48   #5
Candidat au titre de Membre du Club
 
Inscription : septembre 2011
Messages : 6
Détails du profil
Informations forums :
Inscription : septembre 2011
Messages : 6
Points : 12
Points : 12
Bonjour,

Merci pour votre réponse.
Le "ls" dans le script fonctionne et permet d'afficher tous les liens symboliques...!
Avez vous un meilleur conseil pour lister l'ensemble des liens dans un répertoire ?

Sinon comme déjà évoqué , je rencontre un problème lorsqu'il y a plusieurs réponses :
Exemple : le ls renvoie A B C D E F
l'utilisateur entre comme réponse A B E F

La boucle devrait permettre de lire la réponse A , puis la réponse B, puis la réponse......sachant que les commandes lancées derrière prennent en compte les différentes valeurs

Code :
1
2
/usr/bin/ant portlet.deploy -DportletApp=/XXX/A.war
        rm -rf Portail/webapps/A/WEB-INF/lib/portlet-api-1.0.jar
puis
Code :
1
2
/usr/bin/ant portlet.deploy -DportletApp=/XXX/B.war
        rm -rf Portail/webapps/B/WEB-INF/lib/portlet-api-1.0.jar
puis....... x fois en fonction du nombre des réponses

Or il prend uniquement A !!! ?

Merci d'avance
Bonne journée
jffskyx est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 15/09/2011, 13h02   #6
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 071
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 071
Points : 4 154
Points : 4 154
Bonjour,

Citation:
Le "ls" dans le script fonctionne
<abus>La bombe atomique, ça fonctionne; c'est pas pour autant que c'est bien de l'utiliser !</abus>
Citation:
Avez vous un meilleur conseil pour lister l'ensemble des liens dans un répertoire ?
Code :
1
2
3
> fichier.txt
ln -s fichier.txt fichier.lnk
for f in ./*; do [ -L "$f" ] && printf '%s\n' "$f"; done
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 15/09/2011, 13h16   #7
Candidat au titre de Membre du Club
 
Inscription : septembre 2011
Messages : 6
Détails du profil
Informations forums :
Inscription : septembre 2011
Messages : 6
Points : 12
Points : 12
Ok pour le coté "ls".

Par contre, avez une piste pour le traitement des réponses (il faut que je traite la chaine de réponse ? ......)
Idem avez vous un conseil par rapport à ce besoin ?
Merci beaucoup d'avance
jffskyx est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 15/09/2011, 13h45   #8
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 071
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 071
Points : 4 154
Points : 4 154
dans la boucle, il faut utiliser la variable qu'elle initialise :
Code :
1
2
3
for rep in $reponses
do echo $rep
done
et, évite les noms de variables en majuscules, c'est reservé aux variables d'environnements, telle que :
SHELL
USER
...
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 15/09/2011, 14h33   #9
Candidat au titre de Membre du Club
 
Inscription : septembre 2011
Messages : 6
Détails du profil
Informations forums :
Inscription : septembre 2011
Messages : 6
Points : 12
Points : 12
Par défaut script-bash-boucle-lecture-arguments [RESOLU]

Super !
Tout fonctionne correctement....!
Merci beaucoup pour vos réponses, conseils......

Bonne journée
Cordialement
jffskyx est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 15/09/2011, 15h22   #10
Membre actif
 
Homme
Inscription : août 2011
Messages : 44
Détails du profil
Informations personnelles :
Sexe : Homme

Informations forums :
Inscription : août 2011
Messages : 44
Points : 153
Points : 153
Bonjour,

En lisant ta demande initiale, je pense que ceci peut t'intéresser :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#!/bin/bash
dossiers=()
while :
do
  PS3="Quel dossier voulez-vous traiter ?"
  select unDossier in */ "fin de la selection" quitter
  do
     case "${unDossier}" in
     quitter) exit;;
     'fin de la selection') break 2;;
     *) break;;
     esac
  done
  [[ ${unDossier} ]] && dossiers+=( "${unDossier}" )
done
[[ ${dossiers[@]} ]] && {
        echo "Vous avez choisi les dossiers suivants :"
        printf '\t - %s\n' "${dossiers[@]}"
}
chardclo est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 15/09/2011, 17h59   #11
Candidat au titre de Membre du Club
 
Inscription : septembre 2011
Messages : 6
Détails du profil
Informations forums :
Inscription : septembre 2011
Messages : 6
Points : 12
Points : 12
Merci pour le conseil !

Dernière petite chose ! (est-ce qu'il faut faire un nouveau post ?)

Comment rediriger la(les) réponses dans un fichier ?
Merci d'avance
Bonne soirée
jffskyx est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 16/09/2011, 08h13   #12
Expert Confirmé Sénior
 
Avatar de Sve@r
 
Homme Frédéric
Ingénieur développement logiciels
Inscription : février 2006
Messages : 3 055
Détails du profil
Informations personnelles :
Nom : Homme Frédéric
Âge : 44
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 : 3 055
Points : 4 934
Points : 4 934
Citation:
Envoyé par jffskyx Voir le message
Merci pour le conseil !

Dernière petite chose ! (est-ce qu'il faut faire un nouveau post ?)

Comment rediriger la(les) réponses dans un fichier ?
Merci d'avance
Bonne soirée
Hey

Soit tu lances ton script en le redirigeant, soit tu inclus la redirection dans le script lui-même...

Citation:
Envoyé par jffskyx Voir le message
Ok pour le coté "ls".
Attention, il s'agit ici d'un peu d'humour entre N_Bah et moi.

En fait, j'ai l'habitude quand je veux traiter un flot entrant d'informations (c.a.d. des infos répétées sur plusieurs lignes comme par exemple ping), d'utiliser une boucle de traitement de ligne basée sur read. Exemple
Code bash :
1
2
3
4
ping machine |while read info
do
    ... traitement sur $info...
done
Le read allant lire l'entrée standard venue du pipe, il lira une ligne qu'il stockera dans info. Et etc etc.

Ce mécanisme fonctionne pour toute commande. J'ai donc généralement l'habitude de l'utiliser pour tout et aussi pour traiter les fichiers en récupérant les fichiers via ls
Code bash :
1
2
3
4
ls |while read info
do
    ... traitement sur $info...
done

N_Bah me chambre gentiment chaque fois qu'il voit mes posts à ce sujet (son trait sur la ligue anti ls m'était destiné) car lui il préfère utiliser un outil intégré dans le shell. Il a d'ailleurs raison car un outil en natif est plus rapide qu'un mécanisme basé sur une commande externe + pipe. Mais de mon coté j'aime bien rester dans un mécanisme très général.
Toutefois ce n'est pas parce que ls peut être remplacé par * qu'il faut le négliger. Parce que imaginons que tu veuilles traiter les fichiers mais aussi leurs attributs, peut-être que tu seras amené à passer par un truc comme
Code bash :
1
2
3
4
ls -l | while read info
do
    ... traitement sur $info...
done

__________________
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Tout ce qu'un individu reçoit sans rien faire pour l'obtenir, un autre individu a dû travailler pour le produire sans en tirer profit.
Tout Pouvoir ne peut distribuer aux uns que ce qu'il a préalablement confisqué à d'autres car on n'accroît pas les biens en les divisant.
Quand la moitié d'un peuple croit qu'il ne sert à rien de faire des efforts car l'autre moitié les fera pour elle, et quand cette dernière moitié se dit qu'il ne sert à rien d'en faire car ils bénéficieront à d'autres, cela s'appelle le déclin et la fin d'une nation.
Dr. Adrian Rogers, 1931
Sve@r est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h45.


 
 
 
 
Partenaires

Hébergement Web