[Bash] choisir une ligne d'un fichier avec une boucle select

choisir une ligne d'un fichier avec une boucle select [Bash] - Shell/Batch - Programmation

Marsh Posté le 18-04-2007 à 18:09:54    

Bonjour à tous,
je ne pense pas que mon titre soit très explicite mais c'est ce que j'ai trouvé de mieux, alors je m'en excuse.
Je cherche, pour un script bash, à proposer à l'utilisateur de choisir une ligne d'un fichier, pour cela je pense utiliser une structure select, cependant je n'arrive pas à énumérer le fichier ligne à ligne :
par exemple, j'ai essayé select variable in `cat fichier` ; ...
dans ce cas là, j'ai en 1) le premier mot , en 2) le second mot ...
 
j'ai aussi cherché en faisant :
select variable in `while read ligne ; do echo "$ligne" ; done <a `; do...
"while read ligne ; do echo "$ligne" ; done <a"  affiche le fichier ligne à ligne
mais rebelote, ça ne marche pas comme je veux, ça affiche mot à mot
 
Le but est de demander à l'utilisateur la ligne à supprimer dans un fichier, l'avantage du select est de ne pas avoir à retaper toute la ligne ce qui évite des fautes de frappe et autres.
 
Est-ce que vous auriez une idée de la manière de procéder, ou des autres pistes pour arriver au même résultat ?
 
Merci de m'avoir lu et de votre aide

Reply

Marsh Posté le 18-04-2007 à 18:09:54   

Reply

Marsh Posté le 20-04-2007 à 10:45:18    

petitomme a écrit :

Bonjour à tous,
je ne pense pas que mon titre soit très explicite mais c'est ce que j'ai trouvé de mieux, alors je m'en excuse.
Je cherche, pour un script bash, à proposer à l'utilisateur de choisir une ligne d'un fichier, pour cela je pense utiliser une structure select, cependant je n'arrive pas à énumérer le fichier ligne à ligne :
par exemple, j'ai essayé select variable in `cat fichier` ; ...
dans ce cas là, j'ai en 1) le premier mot , en 2) le second mot ...
 
j'ai aussi cherché en faisant :
select variable in `while read ligne ; do echo "$ligne" ; done <a `; do...
"while read ligne ; do echo "$ligne" ; done <a"  affiche le fichier ligne à ligne
mais rebelote, ça ne marche pas comme je veux, ça affiche mot à mot
 
Le but est de demander à l'utilisateur la ligne à supprimer dans un fichier, l'avantage du select est de ne pas avoir à retaper toute la ligne ce qui évite des fautes de frappe et autres.
 
Est-ce que vous auriez une idée de la manière de procéder, ou des autres pistes pour arriver au même résultat ?
 
Merci de m'avoir lu et de votre aide


 
Hello !!!
Bon, ton problème est parfaitement explicite. L'ennui c'est que la boucle "select" travaille en effet mot à mot. C'est son principe et on y peut rien (comme la boucle "for" ).
Mais tu peux arriver à gruger, par exemple, si tu veux proposer 3 phrases en choix, tu peux faire
select var in "phrase 1" "phrase 2" "phrase 3" (avec des guillemets pour grouper les mots de chaque phrase)
 
Donc l'idée, c'est d'arriver à créer un truc qui t'affiche ton fichier ligne par ligne, mais en y rajoutant des guillemets. Normallement , ceci devrait marcher
 
select variable in `while read ligne ; do echo "\"$ligne\"" ; done <a `
do
...
done
 
En fait, tu y étais presque avec ta 2° solution. Il te manquait juste les guillemets en début et fin de ligne...


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 20-04-2007 à 15:09:09    

Ok merci beaucoup de ton aide,
En fait j'ai rusé autrement (je devais faire ce script pour aujourd'hui) : vu qu'il s'agissait d'un fichier de configuration qui était rempli par ce même script, j'ai séparé les mots de chaque ligne par ":" plutôt qu'un espace.
C'est un peu brouillon quand on affiche les lignes mais ça m'a permis de finir à temps.

Reply

Marsh Posté le 20-04-2007 à 17:03:11    

petitomme a écrit :

Ok merci beaucoup de ton aide,
En fait j'ai rusé autrement (je devais faire ce script pour aujourd'hui) : vu qu'il s'agissait d'un fichier de configuration qui était rempli par ce même script, j'ai séparé les mots de chaque ligne par ":" plutôt qu'un espace.
C'est un peu brouillon quand on affiche les lignes mais ça m'a permis de finir à temps.


 
Surtout que ma solution proposée ce matin ne fonctionne pas. En fait, les guillemets doivent être attrappés par le shell avant l'interprétation et lorsque le "echo" s'affiche, l'interprétation a commencé donc ça ne marche pas.
 
J'ai cherché plein de moyens et j'ai finallement trouvé via la commande "eval". Cette commande a pour but d'interpréter ses arguments puis de faire exécuter le résultat par le shell => ex: eval date
 
Donc j'ai trouvé en faisant ceci

fic=`cat fichier |while read lig; do echo "\"$lig\""; done`
eval select choix in `echo $fic`; do echo $choix; done



---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed