IPB

Bienvenue invité ( Connexion | Inscription )

 
Reply to this topicStart new topic
> scripts /bin/sh recup parametres ?
Options
jldo
posté 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.
Go to the top of the page
 
+Quote Post
osnola
posté 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.
Go to the top of the page
 
+Quote Post
jldo
posté 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.
Go to the top of the page
 
+Quote Post
osnola
posté 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.
Go to the top of the page
 
+Quote Post
jldo
posté 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 ...)
Go to the top of the page
 
+Quote Post
yponomeute
posté 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



Citation (jldo @ 14 May 2014, 10:11) *
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
Go to the top of the page
 
+Quote Post
noop
posté 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.
Go to the top of the page
 
+Quote Post

Reply to this topicStart new topic
1 utilisateur(s) sur ce sujet (1 invité(s) et 0 utilisateur(s) anonyme(s))
0 membre(s) :

 



Nous sommes le : 25th April 2024 - 01:33