#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
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
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
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 ..."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.
Dernière modification par Watael (Le 10/06/2010, à 03:06)
Connected \o/
Welcome to sHell. · eval is evil.
En ligne