scripts /bin/sh recup parametres ? |
Bienvenue invité ( Connexion | Inscription )
scripts /bin/sh recup parametres ? |
13 May 2014, 09:16
Message
#1
|
|
Nouveau Membre Groupe : Membres Messages : 6 Inscrit : 5 Oct 2006 Membre no 69 697 |
Bonjour à tous,
j'écris un shell (/bin/sh) qui doit récupérer des paramètres dans les 4 premières lignes de 4 (par ex.) fichiers. Ligne de commande : script file1 ... file4 Ma question : comment écrire la boucle qui me permettra de traiter successivement chacun de ces fichiers, en récupérant leur nom sur la ligne de commande ($# paramètres). J'ai cru comprendre que le mieux aurait été la syntaxe "case $file in" qui ne me semble plus portée par OSX ? Sans doute peut-on utiliser des boucles for ou while ... mais je n'arrive pas à récupérer le n-ième paramètre ... Merci de votre aide. |
|
|
13 May 2014, 09:24
Message
#2
|
|
Macbidouilleur d'Or ! Groupe : Membres Messages : 1 571 Inscrit : 21 Sep 2004 Lieu : Nancy Membre no 23 949 |
Bonjour,
en utilisant "shift", comme par exemple: Code #!bin/sh while [ "$1" != "" ]; do echo "Param: $1" shift done qui doit marcher si tu ne comptes pas passer d'argument vide... Note: pour case, je viens d'essayer (c'est un mot clé que j'utilise peu), mais il marche toujours... Ce message a été modifié par osnola - 13 May 2014, 09:28. |
|
|
13 May 2014, 15:23
Message
#3
|
|
Nouveau Membre Groupe : Membres Messages : 6 Inscrit : 5 Oct 2006 Membre no 69 697 |
Merci de votre réponse.
Je n'ai pas réussi à utiliser case (OSX 10.6.8 ?). Mais je crois y être arrivé (lire la 2ème ligne des fichiers passés en paramètres) : for file in $*; do ligne2 = `head -1 $file".csv" | tail -1 | awk '{ printf "%s", substr($5,1,8) }' `; echo ligne2 done qui me donne la substr($5,1,8) de la 2eme ligne de chaque fichier. Cela faisait longtemps que je n'avais pas écrit en shell ... Merci encore et dites-moi si vous pensez que je fais une erreur. |
|
|
14 May 2014, 07:54
Message
#4
|
|
Macbidouilleur d'Or ! Groupe : Membres Messages : 1 571 Inscrit : 21 Sep 2004 Lieu : Nancy Membre no 23 949 |
Bonjour,
tu dois pouvoir simplifier en écrivant : Code #/bin/sh for file in "$1" "$2" "$3" "$4"; do head -2 "$file.csv" | tail -1 | awk '{ printf "%s", substr($5,1,8) }'; done sinon il est fort possible que awk soit capable de récupérer la deuxième ligne d'un fichier ..., mais je ne l'ai plus utilisé depuis des années et jamais de façon poussé. Pour finir un petit programme pour tester case: Code #/bin/sh case $1 in 1) echo "trouve 1";; 2*) echo "trouve 2...";; *) echo inconnu;; esac osnola Ce message a été modifié par osnola - 14 May 2014, 07:55. |
|
|
14 May 2014, 09:11
Message
#5
|
|
Nouveau Membre Groupe : Membres Messages : 6 Inscrit : 5 Oct 2006 Membre no 69 697 |
Ca marche !
Desolé du dérangement ... J'avais dû faire une erreur bête sur mes tests ... que j'ai perdus, puisque contourné le pb . En tous cas je note la solution, elle me sera utile car beaucoup plus claire que les pipes que j'ai utilisés ! Merci beaucoup de votre aide (je suis un vieil informaticien UNIX, et adore la programmation shell, mais j'ai perdu des reflexes ...) |
|
|
14 May 2014, 09:24
Message
#6
|
|
Macbidouilleur d'Or ! Groupe : Membres Messages : 4 969 Inscrit : 26 Jan 2011 Lieu : Pollachius virens Membre no 164 083 |
Ca marche ! Desolé du dérangement ... J'avais dû faire une erreur bête sur mes tests ... que j'ai perdus, puisque contourné le pb . En tous cas je note la solution, elle me sera utile car beaucoup plus claire que les pipes que j'ai utilisés ! Merci beaucoup de votre aide (je suis un vieil informaticien UNIX, et adore la programmation shell, mais j'ai perdu des reflexes ...) J'ai ce lien dans mes favoris http://www.tldp.org/LDP/abs/html/ qui me sert souvent lorsque j'ai besoin de me rafraichir la mémoire sur la programmation shell. -------------------- MBP 2017 15" avec clavier pourri et touchbar inutile
|
|
|
14 May 2014, 10:13
Message
#7
|
|
Macbidouilleur d'Or ! Groupe : Membres Messages : 2 964 Inscrit : 3 Nov 2005 Membre no 49 239 |
En plus court (et corrigé car des fautes)
- ne pas laisser d'espaces entre ligne2 = - ne pas oublié le $ pour une variable Code for file in $*;
do ligne2=$(awk 'NR == 2 { printf "%s", substr($5,1,8); exit}' "$file") echo $ligne2 done Ce message a été modifié par noop - 14 May 2014, 10:18. |
|
|
Nous sommes le : 27th April 2024 - 03:03 |