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 08/10/2015, à 23: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, à 12:01)

Hors ligne

#2 Le 08/10/2015, à 23: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 smile
je ne fais pas vraiement de bash donc je ne peux pas être plus précis sorry.


Rouillé

Hors ligne

#3 Le 09/10/2015, à 00: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 09/10/2015, à 00:32)


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

Hors ligne

#4 Le 09/10/2015, à 02: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, à 04:02)

Hors ligne

#5 Le 09/10/2015, à 08: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, à 08:19)


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

Hors ligne

#6 Le 09/10/2015, à 09: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, à 09: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, à 10: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, à 10:42

nany

Re : IF || (or) avec une variable commune à toutes les comparaisons[RESOLU]

Bonjour,

serged a écrit :

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

En ligne

#10 Le 09/10/2015, à 12:00

jean-luc5629

Re : IF || (or) avec une variable commune à toutes les comparaisons[RESOLU]

MicP a écrit :

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, à 10:27

Postmortem

Re : IF || (or) avec une variable commune à toutes les comparaisons[RESOLU]

Salut,

jean-luc5629 a écrit :

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