#1 Le 08/10/2015, à 22:29
- jean-luc5629
IF || (or) avec une variable commune à toutes les comparaisons[RESOLU]
Bonsoir;
je suis à écrire un script, et dans celui ci je me retrouve avec une ligne que je n'arrive pas à simplifier :
De multiples comparaisons avec un des des éléments commun à toutes les comparaisons $n1 :
if [ "$n1" = "106" ] || [ "$n1" = "114" ] || [ "$n1" = "122" ] || [ "$n1" = "130" ] || [ "$n1" = "138" ] || [ "$n1" = "146" ] || [ "$n1" = "154" ] || [ "$n1" = "162" ] || [ "$n1" = "170" ] || [ "$n1" = "178" ] || [ "$n1" = "186" ] || [ "$n1" = "194" ];then sd=$sd$id$"\n"; else sd=$sd$id;fi
fi
ça fonctionne...mais pas très joli...
J'aurais voulu faire plus court...mais je ne vois pas ...
Une idée...merci.
Dernière modification par jean-luc5629 (Le 09/10/2015, à 11:01)
Hors ligne
#2 Le 08/10/2015, à 22:38
- Oni_Shadow
Re : IF || (or) avec une variable commune à toutes les comparaisons[RESOLU]
en python tu peux faire un truc genre
val = [106, 114, 122, 130]
if val.any == $n1:
ou
if $n1 in val :
il doit y avoir un équivalent en bash regarde du coté des méthodes associées aux tableaux
je ne fais pas vraiement de bash donc je ne peux pas être plus précis sorry.
Rouillé
Hors ligne
#3 Le 08/10/2015, à 23:31
- Watael
Re : IF || (or) avec une variable commune à toutes les comparaisons[RESOLU]
salut,
je ferais bien une boucle sur les valeurs, comportant un test comparant $n1 à chacune, si l'un des tests est validé, une variable est incrémentée et la boucle est interrompue.
ensuite je teste la variable pour décider quelle opération réaliser.
NB: `=' est un test lexical, et non un test arithmétique.
cf . help test
Dernière modification par Watael (Le 08/10/2015, à 23:32)
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#4 Le 09/10/2015, à 01:25
- MicP
Re : IF || (or) avec une variable commune à toutes les comparaisons[RESOLU]
Pour tests :
michel@debG53SW:~$ laListe=(106 114 122 130 138 146 154 162 170 178 186 194);
michel@debG53SW:~$ siTuYes () { for element in "${laListe[@]}"; do [[ "${element}" == "${1}" ]] && return 0; done; return 1; };
michel@debG53SW:~$ siTuYes 100 && echo "Oui, je suis dans la liste" || echo "Non, je ne suis PAS dans la liste";
Non, je ne suis PAS dans la liste
michel@debG53SW:~$ siTuYes 186 && echo "Oui, je suis dans la liste" || echo "Non, je ne suis PAS dans la liste";
Oui, je suis dans la liste
michel@debG53SW:~$
=======
Donc, une fois la variable tableau laListe et la fonction siTuYes créées :
laListe=(106 114 122 130 138 146 154 162 170 178 186 194);
siTuYes () { for element in "${laListe[@]}"; do [[ "${element}" == "${1}" ]] && return 0; done; return 1; };
Il ne reste plus qu'à les utiliser dans ton script :
siTuYes $n1 && sd=$sd$id$"\n" || sd=$sd$id;
Dernière modification par MicP (Le 09/10/2015, à 03:02)
Hors ligne
#5 Le 09/10/2015, à 07:19
- Hizoka
Re : IF || (or) avec une variable commune à toutes les comparaisons[RESOLU]
Sinon il y a case :
case "$n" in
106) echo "le chiffre est 106" ;;
114) echo "le chiffre est 114" ;;
*) echo "le chiffre est différent de ce que l'on attend" ;;
esac
Dernière modification par Hizoka (Le 09/10/2015, à 07:19)
KDE Neon 64bits
Tous mes softs (MKVExtractorQt, HizoSelect, HizoProgress, Qtesseract, Keneric, Services menus...) sont sur github
Hors ligne
#6 Le 09/10/2015, à 08:02
- Watael
Re : IF || (or) avec une variable commune à toutes les comparaisons[RESOLU]
bon, puisque je vois que le fait que ce sont des nombres ne vous dérangent pas, on peut aussi y aller à coup de regex.
en BASH ::
$ list=( 106 114 122 130 138 146 154 162 170 178 186 194 )
$ regex=$(IFS='|'; echo "^(${list[*]})\$")
$ [[ 112 =~ $regex ]] && echo 'exec commande' || echo 'exec autre commande'
exec autre commande
$ [[ 122 =~ $regex ]] && echo 'exec commande' || echo 'exec autre commande'
exec commande
$ [[ 11122 =~ $regex ]] && echo 'exec commande' || echo 'exec autre commande'
exec autre commande
Connected \o/
Welcome to sHell. · eval is evil.
Hors ligne
#7 Le 09/10/2015, à 08:24
- serged
Re : IF || (or) avec une variable commune à toutes les comparaisons[RESOLU]
le case est une bonne solution. Sinon une boucle for :
for $val in 106 114 122 130 138 146 154 162 170 178 186 194
do
if [ "$val" = "$n1" ] then
echo "gagné"
break ;
fi
done
LinuxMint Vera Cinnamon et d'autres machines en MATE, XFCE... 20.x , 21.x ou 19.x
Tour : Asus F2A55 / AMD A8-5600K APU 3,6GHz / RAM 16Go / Nvidia GeForce GT610 / LM21.1 Cinnamon
Portable : LDLC Mercure MH : Celeron N3450 /RAM 4Go / Intel HD graphics 500 i915 / biboot Win 10 (sur SSD) - LM21.1 MATE (sur HDD)
Hors ligne
#8 Le 09/10/2015, à 09:15
- MicP
Re : IF || (or) avec une variable commune à toutes les comparaisons[RESOLU]
C'est vrais que ma proposition ne fonctionnait que pour des valeurs numériques.
Mais on pourrait aussi utiliser grep pour que ça fonctionne aussi avec les chaînes de caractères.
michel@debG53SW:~$ laListe="106 114 ailleurs 122 130 138 146 154 162 170 178 186 194 ici ou là"
michel@debG53SW:~$ grep '100' <<< $laListe 1>/dev/null && echo "OK" || echo "pasOk"
pasOk
michel@debG53SW:~$ grep 'ailleurs' <<< $laListe 1>/dev/null && echo "OK" || echo "pasOk"
OK
michel@debG53SW:~$ grep '186' <<< $laListe 1>/dev/null && echo "OK" || echo "pasOk"
OK
michel@debG53SW:~$
Hors ligne
#9 Le 09/10/2015, à 09:42
- nany
Re : IF || (or) avec une variable commune à toutes les comparaisons[RESOLU]
Bonjour,
le case est une bonne solution.
+1
Et, en améliorant un peu la proposition d’Hizoka :
case "$n" in
106|114) echo "le chiffre est $n" ;;
*) echo "le chiffre est différent de ce que l'on attend" ;;
esac
Ce qui donnerait pour le cas de jean-luc5629 :
case "$n1" in
106|114|122|130|138|146|154|162|170|178|186|194)
sd=$sd$id$"\n"
;;
*)
sd=$sd$id
;;
esac
Hors ligne
#10 Le 09/10/2015, à 11:00
- jean-luc5629
Re : IF || (or) avec une variable commune à toutes les comparaisons[RESOLU]
Pour tests :
michel@debG53SW:~$ laListe=(106 114 122 130 138 146 154 162 170 178 186 194); michel@debG53SW:~$ siTuYes () { for element in "${laListe[@]}"; do [[ "${element}" == "${1}" ]] && return 0; done; return 1; }; michel@debG53SW:~$ siTuYes 100 && echo "Oui, je suis dans la liste" || echo "Non, je ne suis PAS dans la liste"; Non, je ne suis PAS dans la liste michel@debG53SW:~$ siTuYes 186 && echo "Oui, je suis dans la liste" || echo "Non, je ne suis PAS dans la liste"; Oui, je suis dans la liste michel@debG53SW:~$
=======
Donc, une fois la variable tableau laListe et la fonction siTuYes créées :laListe=(106 114 122 130 138 146 154 162 170 178 186 194); siTuYes () { for element in "${laListe[@]}"; do [[ "${element}" == "${1}" ]] && return 0; done; return 1; };
Il ne reste plus qu'à les utiliser dans ton script :
siTuYes $n1 && sd=$sd$id$"\n" || sd=$sd$id;
Merci à vous tous;
Les valeurs étant numériques, j'ai adopté celle ci...mais toutes sont intéressantes à connaître.
Hors ligne
#11 Le 10/10/2015, à 09:27
- Postmortem
Re : IF || (or) avec une variable commune à toutes les comparaisons[RESOLU]
Salut,
Les valeurs étant numériques, j'ai adopté celle ci...mais toutes sont intéressantes à connaître.
Les valeurs étant numériques, il ne faut pas tester comme ça :
[[ "${element}" == "${1}" ]]
Mais comme ça :
[[ "${element}" -eq "${1}" ]]
Ou :
(( "${element}" == "${1}" ))
Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »
Hors ligne