Debian-facile

Bienvenue sur Debian-Facile, site d'aide pour les nouveaux utilisateurs de Debian.

Vous n'êtes pas identifié(e).

#1 27-05-2010 17:31:22

Bisounours
Membre
Inscription : 16-02-2008

echapper + pipe + scripte shell [résolu]

bonjour,

je voudrait mettre dans une variable toto="|grep -i toto"
pour par la suite faire, cat /fichier $toto.

Le prob ses que le scripte ne prend pas du tout le pipe |.

j'ai tentez d'utilisez le \ mais le retour est toujours le même à savoir cat: option invalide --i

Dernière modification par Bisounours (01-06-2010 20:57:29)

Hors ligne

#2 28-05-2010 00:17:44

tux12
Membre
Lieu : ./
Distrib. : Squeeze
Noyau : Linux 2.6.32-5-686-bigmem
(G)UI : KDE
Inscription : 27-02-2008

Re : echapper + pipe + scripte shell [résolu]

Bonjour Bisounours,

Pourquoi ne pas utiliser la syntaxe classique de grep, soit grep -i toto /fichier  ?
Plus besoin de cat ni de pipe dans ce cas.

@+

Hors ligne

#3 28-05-2010 09:30:05

Bisounours
Membre
Inscription : 16-02-2008

Re : echapper + pipe + scripte shell [résolu]

je vais donnez un peut plus de détail sur le scripte

complet=0
while getopts a:bc:d option
do
case $option in
  a)
   user="|grep -i $OPTARG"
   ;;
  b)
   bidule="|grep -i $OPTARG"
   ;;
  c)
   complet=1
   ;;
  d)
   date="|grep -i $OPTARG"
   ;;
esac
done
case complet in
  0)
   cat /fichier $user $bidule $date |tail -3
   ;;
  1)
   cat /fichier $user $bidule $date
   ;;
esac


Comme on le voie dans le code, l'utilisateur n'est pas obligez d'utilisez tout les arguments.
Ses pour sa que je doit passez par des variables.

Merci de tas réponse tout de même

Hors ligne

#4 28-05-2010 20:57:40

Asmodée
Membre
Lieu : /dev/null
Distrib. : Squeeze
Inscription : 16-05-2010

Re : echapper + pipe + scripte shell [résolu]

Ben tu utilises la syntaxe normale ou pas et tu crées une condition pour évaluer ce que l'utilisateur a renseigné ou non... Puis tu filtres... D'une façon générale, insérer des bouts de codes dans une variable n'est vraiment pas propre.

EDIT:...et ça ne fonctionnera pas

Dernière modification par Asmodée (28-05-2010 21:01:40)

Hors ligne

#5 01-06-2010 20:57:05

Bisounours
Membre
Inscription : 16-02-2008

Re : echapper + pipe + scripte shell [résolu]

je fais des grep successif pour épurer en fonction de condition le fichier et je le surprime a la fin.

par-contre je te sens agressif dans ton message Asmodée. si tu mes le pipe devants la variable au lieu de le mettre dans la variable. comme se si

 cat /fichier |$user |$bidule |$date |tail -3


tu verras que cela fonctionne.

Hors ligne

#6 08-06-2010 13:07:25

Asmodée
Membre
Lieu : /dev/null
Distrib. : Squeeze
Inscription : 16-05-2010

Re : echapper + pipe + scripte shell [résolu]

Je ne suis pas agressif... Je constate juste que dans ce cas précis, au lieu de chercher à savoir programmer en bash, tu t'es plutôt jeté à corps perdu dans la réalisation d'un script qui ne rempli pas le cahier des charges que tu t'étais fixé. Et au lieu de te dire que tu n'as, peut-être, pas utilisé la méthode qu'il fallait, tu t'es laissé "choisir" par une méthode (pipes, variables exécutables) au lieu de choisir une méthode efficace.

Et je sais que cela fonctionne. Mais pas tel que tu l'affichais dans ton second message. Je dis simplement que c'est sale et que, par définition de "sale" en informatique, ton code ne fonctionne pas et tu éprouves milles peines à savoir pourquoi.

Alors qu'il est si simple d'utiliser deux if et demi pour rendre ton code clair et facilement déboguable.

Les pipes, c'est bien, c'est court, c'est joli et génial à utiliser dans un terminal mais leur intérêt tend vers 0 dans un script bash.

En l'occurrence, il est mille fois plus propre de faire une boucle for sur chacune de tes variables pour déterminer si elles sont vides ou non. Puis tu fais tes grep les uns après les autres.

En pseudo code (avec un peu de bash et en utilisant grep):

fichier=$1
Pour i dans [a b c d]
si i est vide
alors pass
sinon fichier=`grep -i -f $fichier -e $i`
fin du pour
afficher fichier


Ça semble un brin plus clair non ? Pas de répétition du code et plus robuste.

EDIT: d'autant que l'idée initiale, c'est d'avoir un filtre qui fonctionne même si la variable n'est pas renseignée... Avec les pipes à l'extérieur, comme dans ta dernière solution, ce n'est pas le cas.

EDIT2: Juste une petite remarque : le titre du fil est caractéristique de ce que je disais plus haut... Au lieu de nous demander comment nous ferions pour filtrer plusieurs fois un fichier dans un script en bash (ton cahier des charges) en nous montrant le code que tu as déjà produit, tu demandes comment faire pour que ta méthode fonctionne.
Bref, tu nous demandes de t'aider à déboguer ton script au lieu de nous demander de t'aider à résoudre ton problème.

Dernière modification par Asmodée (08-06-2010 13:24:34)

Hors ligne

#7 08-06-2010 13:47:51

smolski
administrateur quasi...modo
Lieu : AIN
Distrib. : 8 (jessie) 64 bits + backports
Noyau : 4.6.0-0.bpo.1-amd64
(G)UI : gnome 3.14.1
Inscription : 21-10-2008

Re : echapper + pipe + scripte shell [résolu]

@ Asmodée :

Les pipes, c'est bien, c'est court, c'est joli et génial à utiliser dans un terminal mais leur intérêt tend vers 0 dans un script bash.


Ça c'est de l'info qui n'est pas tombé dans l'oreille d'un aveugle scripteur à l'occasion. Merci ! big_smile

Pour la mauvaise formulation de la question, je pense que si on se dépatouille seulement en informatique, on ne peut d'un coup poser la question strictement.
Ici, ton éclairage et celui de tux12 le permet après coup, pas avant. smile

@Bisounours
Bien que je ne ressente pas d'agressivité dans les réponses qui te sont proposées dans ce post, je pense que de ton point de vue, les mains dans le cambouis, ce peut être différent. Courage ! big_smile

Amitié, Joel


"Définition d'eric besson : S'il fallait en chier des tonnes pour devenir ministre, il aurait 2 trous du cul." - JP Douillon
"L'utopie ne signifie pas l'irréalisable, mais l'irréalisée." - T Monod (source :  La zone de Siné)
"Je peux rire de tout mais pas avec n'importe qui." - P Desproges
"saque eud dun" (patois chtimi : fonce dedans)

Hors ligne

Pied de page des forums