Contenu | Rechercher | Menus

Annonce

Si vous rencontrez des soucis à rester connecté sur le forum (ou si vous avez perdu votre mot de passe) déconnectez-vous et reconnectez-vous depuis cette page, en cochant la case "Me connecter automatiquement lors de mes prochaines visites". Attention, le forum rencontre actuellement quelques difficultés. En cas d'erreur 502, il ne faut pas re-valider l'envoi d'un message ou l'ouverture d'une discussion, au risque de créer un doublon.

La section divers se réorganise ! De nouvelles sous-sections à venir. (plus d'infos + donner son avis)

#1 Le 14/04/2010, à 16:02

bece

[résolu] Quelque chose de plus propre qu'une suite d'elif

Bonjour,

Voila, je me demandais s'il y avait quelque chose de plus propre qu'une suite d'elif :

if [ $1 -eq 1 ]; then let "jour = 1"
elif [ $1 -eq 2 ]; then let "jour = 2"
elif [ $1 -eq 3 ]; then let "jour = 3"
elif [ $1 -eq 4 ]; then let "jour = 4"
elif [ $1 -eq 5 ]; then let "jour = 5"
elif [ $1 -eq 6 ]; then let "jour = 6"
elif [ $1 -eq 7 ]; then let "jour = 7"
elif [ $1 -eq 8 ]; then let "jour = 8"
elif [ $1 -eq 9 ]; then let "jour = 9";fi

Dans ce cas le 'case' ne fonctionne pas car l'utilisateur peur rentrer 1 comme 01 ou même 000001.

Merci d'avance smile

Dernière modification par bece (Le 15/04/2010, à 09:08)


http://www.jeremychevrier.com/ -> un jour j'aurai le courage de le réouvrir !
Toshiba Satellite L550-13U - Dual Core T4300 -> Fedora 16
http://www.makinamania.com
"L'informatique, c'est l'art de passer 15 jours à gagner 5 millisecondes"

Hors ligne

#2 Le 14/04/2010, à 16:05

sputnick

Re : [résolu] Quelque chose de plus propre qu'une suite d'elif

case $variable in
  0) jour=0 ;;
  1) jour=1 ;;
  2) jour=2 ;;
  *) echo >&2 "autres cas" ;;
esac

S'il te plait, laisse let à tes ancetres, en 2010 on utilise plus ça.
Cherche /\(\( dans man bash ( copie colle àa dans le man ).


bashfr.org(random);
<arciks1994> dou tu connai qel age j'ai ?

Hors ligne

#3 Le 14/04/2010, à 16:07

Tenshy

Re : [résolu] Quelque chose de plus propre qu'une suite d'elif

peut-être d'abord faire un traitement sur $1 pour retirer les 0 inutiles en début et en fin et après tu peux faire un case

Hors ligne

#4 Le 14/04/2010, à 16:14

bece

Re : [résolu] Quelque chose de plus propre qu'une suite d'elif

sputnick a écrit :

S'il te plait, laisse let à tes ancetres, en 2010 on utilise plus ça.

Si tu le dis tongue

Par contre pour le 'case', j'ai déjà essayé, ça ne fonctionne pas justement à cause des 00 potentiels.

Tenshy a écrit :

peut-être d'abord faire un traitement sur $1 pour retirer les 0 inutiles en début et en fin et après tu peux faire un case

Hum, au final, ça risque d'être plus lourd qu'une suite d'elif, non ?

Dernière modification par bece (Le 14/04/2010, à 16:15)


http://www.jeremychevrier.com/ -> un jour j'aurai le courage de le réouvrir !
Toshiba Satellite L550-13U - Dual Core T4300 -> Fedora 16
http://www.makinamania.com
"L'informatique, c'est l'art de passer 15 jours à gagner 5 millisecondes"

Hors ligne

#5 Le 14/04/2010, à 16:24

Postmortem

Re : [résolu] Quelque chose de plus propre qu'une suite d'elif

Pour prendre en compte le cas où on tape 1, 01, 00001 ou 00000000001 etc... :

case $variable in
+(0) ) jour=0;;
*(0)1 ) jour=1;;
*(0)2 ) jour=2;;
*(0)3 ) jour=3;;
*) echo "Mauvais choix";;
esac

Trusty Tahr (64 bits), Athlon64 3800+, ATI Radeon HD4870

Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#6 Le 14/04/2010, à 16:27

Tenshy

Re : [résolu] Quelque chose de plus propre qu'une suite d'elif

bece a écrit :

Hum, au final, ça risque d'être plus lourd qu'une suite d'elif, non ?

oui plus lourd en effet... mais plus propre... après selon la taille du programme ca va être plutôt négligeable. Et comme ca tu peux réutiliser ta variable si tu en as encore besoin, mais il est vrai que si c'est juste pour la partie de code que tu as donné ca va l'alourdir pour rien.

Après tout dépend de ce pour quoi te sers de ta variable.

Hors ligne

#7 Le 14/04/2010, à 16:46

bece

Re : [résolu] Quelque chose de plus propre qu'une suite d'elif

@ Tenshy : C'est un tout petit script (50 lignes avec les commentaires)
Après j'utilise ma variable pour faire des recherches.

@ Postmortem : Je ne connaissais pas cette subtilité du case roll . Merci smile
Après test, j'ai le droit à une belle erreur :

./script.sh: line 53: syntax error near unexpected token `('
./script.sh: line 53: `	*(0)1) jour=1;;'

Et le code :

case $1 in
	*(0)1 ) jour=1;;
	*(0)2 ) jour=2;;
	*(0)3 ) jour=3;;
	*(0)4 ) jour=4;;
	*(0)5 ) jour=5;;
	*(0)6 ) jour=6;;
	*(0)7 ) jour=7;;
	*(0)8 ) jour=8;;
	*(0)9 ) jour=9;;
	*) help 0;;
esac

Dernière modification par bece (Le 14/04/2010, à 16:49)


http://www.jeremychevrier.com/ -> un jour j'aurai le courage de le réouvrir !
Toshiba Satellite L550-13U - Dual Core T4300 -> Fedora 16
http://www.makinamania.com
"L'informatique, c'est l'art de passer 15 jours à gagner 5 millisecondes"

Hors ligne

#8 Le 14/04/2010, à 16:49

Totor

Re : [résolu] Quelque chose de plus propre qu'une suite d'elif

Bonjour,

Je dirais "tout simplement" comme ceci :

[[ ${variable} =~ [[:digit:]]+ ]] && jour=$((10#${variable}))

-- Lucid Lynx --

Hors ligne

#9 Le 14/04/2010, à 16:57

Postmortem

Re : [résolu] Quelque chose de plus propre qu'une suite d'elif

Oups, ça fonctionne en ksh (je suis au taf et on utilise du ksh)
Je viens d'essayer en bash et en effet, j'ai la même erreur.
C'est bizarre car dans le man de bash sur mon serveur, on voit apparaître ces constructions (dans le paragraphe 'Pattern Matching')


Trusty Tahr (64 bits), Athlon64 3800+, ATI Radeon HD4870

Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#10 Le 14/04/2010, à 17:05

bece

Re : [résolu] Quelque chose de plus propre qu'une suite d'elif

@Totor : j'ai pas tout compris tongue
@Postmortem : Oui, je viens de regarder, mais c'est pas marqué qu'on peut l'appliquer au conditions (enfin, si ça se trouve c'est marqué mais bon je ne suis pas encore bilingue^^).


http://www.jeremychevrier.com/ -> un jour j'aurai le courage de le réouvrir !
Toshiba Satellite L550-13U - Dual Core T4300 -> Fedora 16
http://www.makinamania.com
"L'informatique, c'est l'art de passer 15 jours à gagner 5 millisecondes"

Hors ligne

#11 Le 14/04/2010, à 17:15

Totor

Re : [résolu] Quelque chose de plus propre qu'une suite d'elif

Explications :

[[ ${variable} =~ [[:digit:]]+ ]] : Si ${variable} ne contient que des chiffres (et au moins 1).

10#${variable} : En bash, il est possible d'exprimer des nombres en précisant leur base via la notation [base#]nombre. ici, c'est la base 10 (décimal).

$((10#${variable})) : "Evaluation" de 10#${variable}. Cela permet de supprimer les "0" se trouvant en début de nombre. Il est impératif de préciser la base car si un nombre commence par 0, il est considéré comment étant exprimé en hoctal.

Dernière modification par Totor (Le 14/04/2010, à 17:17)


-- Lucid Lynx --

Hors ligne

#12 Le 14/04/2010, à 17:28

bece

Re : [résolu] Quelque chose de plus propre qu'une suite d'elif

Merci pour les expliquations, est-ce que le [[:digit:]] est égale au [0-9] ?


http://www.jeremychevrier.com/ -> un jour j'aurai le courage de le réouvrir !
Toshiba Satellite L550-13U - Dual Core T4300 -> Fedora 16
http://www.makinamania.com
"L'informatique, c'est l'art de passer 15 jours à gagner 5 millisecondes"

Hors ligne

#13 Le 14/04/2010, à 20:15

Totor

Re : [résolu] Quelque chose de plus propre qu'une suite d'elif

Oui


-- Lucid Lynx --

Hors ligne

#14 Le 15/04/2010, à 11:19

Hizoka

Re : [résolu] Quelque chose de plus propre qu'une suite d'elif

totor et ses commandes de brutes tongue

en tout cas, je mets de coté ce code smile

En ligne

#15 Le 15/04/2010, à 11:24

bece

Re : [résolu] Quelque chose de plus propre qu'une suite d'elif

^^ En tout cas merci, c'est excellent quelque chose qui faisait plusieurs lignes se fait maintenant en une ligne smile


http://www.jeremychevrier.com/ -> un jour j'aurai le courage de le réouvrir !
Toshiba Satellite L550-13U - Dual Core T4300 -> Fedora 16
http://www.makinamania.com
"L'informatique, c'est l'art de passer 15 jours à gagner 5 millisecondes"

Hors ligne

#16 Le 28/04/2010, à 14:04

Postmortem

Re : [résolu] Quelque chose de plus propre qu'une suite d'elif

Merci Totor pour ta commande, elle m'a bien aidé !
Néanmoins, j'ai une petite remarque sur le test.
[[ ${variable} =~ [[:digit:]]+ ]] : cette commande vérifie qu'il y a des chiffres mais s'il y a des chiffres et des lettres, la condition est aussi vraie.
Petit exemple :

# variable=33gdf
# [[ ${variable} =~ [[:digit:]]+ ]] && echo "Que des chiffres" || echo "Autre chose"
Que des chiffres

Pour vérifier qu'il n'y a que des chiffres : [[ ${variable} =~ ^[[:digit:]]+$ ]]

# variable=33gdf
# [[ ${variable} =~ ^[[:digit:]]+$ ]] && echo "Que des chiffres" || echo "Autre chose"
Autre chose
#
# variable=0546
# [[ ${variable} =~ ^[[:digit:]]+$ ]] && echo "Que des chiffres" || echo "Autre chose"
Que des chiffres

Trusty Tahr (64 bits), Athlon64 3800+, ATI Radeon HD4870

Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#17 Le 28/04/2010, à 15:11

Hizoka

Re : [résolu] Quelque chose de plus propre qu'une suite d'elif

[[ ${variable} =~ ^[[:digit:]]*$ ]] && echo "Que des chiffres" || echo "Autre chose"

fonctionne aussi

Dernière modification par Hizoka (Le 28/04/2010, à 15:21)

En ligne

#18 Le 28/04/2010, à 15:30

Postmortem

Re : [résolu] Quelque chose de plus propre qu'une suite d'elif

Oui mais non !! lol
Cette condition est vraie pour la chaîne vide :

# variable=
# [[ ${variable} =~ ^[[:digit:]]*$ ]] && echo "Que des chiffres" || echo "Autre chose"
Que des chiffres

Alors que :

# variable=
# [[ ${variable} =~ ^[[:digit:]]+$ ]] && echo "Que des chiffres" || echo "Autre chose"
Autre chose

Trusty Tahr (64 bits), Athlon64 3800+, ATI Radeon HD4870

Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

Haut de page ↑