Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 06/06/2010, à 22:58

Hizoka

[resolu] while contenant un select

Bonsoir, je viens de rencontrer un probleme...

je voudrais imbriquer un select dans un while, comme par exemple :

test="a
b
c"

while read argument
do
	select ati in a b c x y z
	do
		case "${ati}" in
			a) echo "a" && break ;;
			b) echo "b" && break ;;
			c) echo "c" && break ;;
			x) echo "x" && break ;;
			y) echo "y" && break ;;
			z) echo "z" && break ;;
		esac
	done
done < <(echo "$test")

le probleme c'est que ça me fait :

1) a
2) b
3) c
4) x
5) y
6) z
#? #? #? 
hizoka@hizo-pc:~$

il affiche les proposition mais ne me laisse pas la possibilité d'y répondre...

à quoi cela peut-il être dû ?!


Sans le select :

while read argument
do
case "${argument}" in
a) echo "a" ;;
b) echo "b" ;;
c) echo "c" ;;
x) echo "x" ;;
y) echo "y" ;;
z) echo "z" ;;
esac
done < <(echo "$test")

cela me retourne bien :

a
b
c

Dernière modification par Hizoka (Le 09/06/2010, à 15:10)


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#2 Le 06/06/2010, à 23:40

Watael

Re : [resolu] while contenant un select

Bonsoir Hizoka,

telle quelle, la commande select ne fonctionne pas en dehors de la boucle.

ensuite, le problème est le même, que d'utiliser une commande read à l'intérieur d'une boucle while : il faut dupliquer l'entrée standard, et utiliser ce dernier descripteur de fichier, avec la commande censée lire l'entrée standard (actuellement occupée par la lecture de la variable, ou du fichier)

Dernière modification par Watael (Le 06/06/2010, à 23:44)


Connected \o/
Welcome to sHell. · eval is evil.

En ligne

#3 Le 06/06/2010, à 23:47

twocats

Re : [resolu] while contenant un select

done < <(echo "$test")

Cela ne change rien mais évite ce genre de construction inutile

done <<<"$test"

La réponse est 42

Hors ligne

#4 Le 06/06/2010, à 23:52

Hizoka

Re : [resolu] while contenant un select

ouais je sais mais j'ai fais le code à l'arrache pour vous donner un exemple smile


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#5 Le 09/06/2010, à 04:25

Watael

Re : [resolu] while contenant un select

#!/bin/bash

test=$'a\nb\nc'

while read argument; do
#   echo "arg = $argument"
   select ati in a b c x y z; do
      case $REPLY in
         1) echo "a"; break ;;
         2) echo "b"; break ;;
         3) echo "c"; break ;;
         4) echo "x"; break ;;
         5) echo "y"; break ;;
         6) echo "z"; break ;;
      esac
   done </dev/tty #<&3
done <<<"$test" #3<&0 <<<"$test"

la version "tortueuse" (telle que décrite) est mise en commentaire.

Dernière modification par Watael (Le 09/06/2010, à 04:26)


Connected \o/
Welcome to sHell. · eval is evil.

En ligne

#6 Le 09/06/2010, à 07:45

Hizoka

Re : [resolu] while contenant un select

merci pour ta solution smile

une question :
Que veux dire : $'...', ce n'est pas la 1ere fois que je vois ça.


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#7 Le 09/06/2010, à 09:24

Totor

Re : [resolu] while contenant un select

ou, sans modifier les FD :

#!/bin/bash

test=$'a\nb\nc'
IFS=$'\n' test=( ${test} ) 

for argument in "${test[@]}"
   select ati in a b c x y z; do
      case $REPLY in
         1) echo "a"; break ;;
         2) echo "b"; break ;;
         3) echo "c"; break ;;
         4) echo "x"; break ;;
         5) echo "y"; break ;;
         6) echo "z"; break ;;
      esac
   done
done

EDIT :
Si test est en réalité un fichier, tu peux procéder ainsi :
IFS=$'\n' test=( $(<fichier) )
ou bien :

#!/bin/bash

exec 3<fichier
while read -u 3 argument
do
   select ati in a b c x y z; do
      case $REPLY in
         1) echo "a"; break ;;
         2) echo "b"; break ;;
         3) echo "c"; break ;;
         4) echo "x"; break ;;
         5) echo "y"; break ;;
         6) echo "z"; break ;;
      esac
   done
done
exec 3<&-

Dernière modification par Totor (Le 09/06/2010, à 16:25)


-- Lucid Lynx --

Hors ligne

#8 Le 09/06/2010, à 11:52

Watael

Re : [resolu] while contenant un select

test=$'a\nb\nc'

c'est, il me semble des  codes ANSI (donc, standard (;)sputnick)). initiés par bash par $'ESCctrlCHAR'; ça évite des tput, et des echo -e
or like
ça marche très bien avec printf, autour du traditionnel %s

Dernière modification par Watael (Le 09/06/2010, à 12:23)


Connected \o/
Welcome to sHell. · eval is evil.

En ligne

#9 Le 09/06/2010, à 15:09

Hizoka

Re : [resolu] while contenant un select

merci, c'est résolu alors smile


KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github

Hors ligne

#10 Le 10/06/2010, à 00:28

Watael

Re : [resolu] while contenant un select

c'est, il me semble des  codes ANSI

mouais sad ..."la prose"...:lol:

man bash /PROTECTION (QUOTING)

Les  mots  de  la  forme  $'chaîne' sont traités spécialement. Le mot est développé en chaîne avec les caractères protégés par contre-oblique remplacés comme spécifié par le standard ANSI C.

pour être précis. smile

Dernière modification par Watael (Le 10/06/2010, à 03:06)


Connected \o/
Welcome to sHell. · eval is evil.

En ligne