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 11/05/2019, à 13:12

AGPArchitecture

[RESOLU] simplification ecriture if

Bonjour à tous et toutes

je suis en train de faire un script et je me demandais si on pouvait simplifier une commande if qui n'a qu'une seule ligne et une seule condition.

voici la commande exemple

if [ -f "$arg" ]; then
	Erreur 0 1 "$arg est un fichier ne peut pas être traité"
fi

Ne pourrais-ton pas simplifier l'écriture en une seule ligne? et est-ce conseillé?

Merci

Dernière modification par AGPArchitecture (Le 13/05/2019, à 19:29)

Hors ligne

#2 Le 11/05/2019, à 13:15

pingouinux

Re : [RESOLU] simplification ecriture if

Bonjour,

if [ -f "$arg" ]; then	Erreur 0 1 "$arg est un fichier ne peut pas être traité"; fi

ou

[ -f "$arg" ] && Erreur 0 1 "$arg est un fichier ne peut pas être traité"

Hors ligne

#3 Le 11/05/2019, à 13:20

AGPArchitecture

Re : [RESOLU] simplification ecriture if

@pingouinux

[ -f "$arg" ] && Erreur 0 1 "$arg est un fichier ne peut pas être traité"

si je comprend bien :

le && execute ce qui suit si la condition est vérifiée.

et comment faire si on veut faire suivre ce qui suit dans le cas d'une vérification négative?

Hors ligne

#4 Le 11/05/2019, à 13:34

pingouinux

Re : [RESOLU] simplification ecriture if

[ -f "$arg" ] && Erreur 0 1 "$arg est un fichier ne peut pas être traité" || echo "Pas d'erreur"

Hors ligne

#5 Le 11/05/2019, à 15:06

nany

Re : [RESOLU] simplification ecriture if

Bonjour,


J’aimerais bien qu’on m’explique en quoi passer un bloc if/fi en une seule ligne simplifie un script.
Je trouve que, au contraire, ça rend la lecture (d’un point de vue humain) du script plus compliquée.
Et je ne pense pas que ça accélère quoi que ce soit.

Hors ligne

#6 Le 11/05/2019, à 18:30

Sciensous

Re : [RESOLU] simplification ecriture if

nanny: ce que tu dis est vrai pour la commande seule; mais je suppose que dans un script un tantinet longuet ça peut être plus simple à relire (les autres lignes hein et pas le if/fi en question)


antiX 19 et 21 et Ubuntu 20.04 et 22.04
( sous LXDE et gnome-shell )

Hors ligne

#7 Le 11/05/2019, à 19:27

erresse

Re : [RESOLU] simplification ecriture if

Pour ma part, je serais assez de l'avis de nany sur ce coup, parce-que pour aérer le code et bien le structurer, il vaut mieux éclater les blocs d'instructions sur plusieurs lignes, avec indentations pour faciliter la lecture.
Lorsque les instructions sont compactes et non documentées, la maintenance est bien plus difficile...


Plus de 50 ans d'informatique, ça en fait des lignes de commandes en console, mais on n'avait pas le choix...
Excellente raison pour, aujourd'hui qu'on le peut, utiliser au maximum les INTERFACES GRAPHIQUES !
Important : Une fois résolu, pensez à clore votre sujet en ajoutant [Résolu] devant le titre du 1er message, et un bref récapitulatif de la solution à la fin de celui-ci. Merci.

Hors ligne

#8 Le 11/05/2019, à 19:34

Watael

Re : [RESOLU] simplification ecriture if

si, si.
au bout d'un certain nombre de lignes, enlever deux lignes à chaque condition simple est un avantage en terme de lecture.

pour faciliter la lecture de ces tests, j'utilise toujours la commande test :

test -f "$arg" && echo "condition remplie" || echo "échec condition"

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

Hors ligne

#9 Le 11/05/2019, à 19:59

LeoMajor

Re : [RESOLU] simplification ecriture if

bonjour,

...alors, vous ne devez pas aimer ...

test -f  "$chocolat"
if [ -f "$chocolat" -a  -f "$cafe" ]; then ...   # and
if [ -f "$chocolat" -o  -f "$cafe" ]; then ...   # or
a=10; echo $(( a>1 ? 3 : 5 ))    #   ---> 3
 
assignation par defaut de a si test chocolat ...
chocolat=3; a=${chocolat:-20}; echo "$a" # -->3
unset chocolat;  a=${chocolat:-20}; echo "$a" # -->20
...

Hors ligne

#10 Le 12/05/2019, à 19:57

nany

Re : [RESOLU] simplification ecriture if

Watael a écrit :

si, si.
au bout d'un certain nombre de lignes, enlever deux lignes à chaque condition simple est un avantage en terme de lecture.

pour faciliter la lecture de ces tests, j'utilise toujours la commande test :

test -f "$arg" && echo "condition remplie" || echo "échec condition"

Merci, je comprends ton point de vue et j’y adhère au final (même si je ne pense pas avoir un jour à faire de longs scripts).



LeoMajor a écrit :

bonjour,

...alors, vous ne devez pas aimer ...

test -f  "$chocolat"
if [ -f "$chocolat" -a  -f "$cafe" ]; then ...   # and
if [ -f "$chocolat" -o  -f "$cafe" ]; then ...   # or
a=10; echo $(( a>1 ? 3 : 5 ))    #   ---> 3
 
assignation par defaut de a si test chocolat ...
chocolat=3; a=${chocolat:-20}; echo "$a" # -->3
unset chocolat;  a=${chocolat:-20}; echo "$a" # -->20
...

Là, en revanche, et même si je comprends ces quelques lignes somme toute assez simples, si on me donnais à lire un script de plus d’une centaine de lignes de la sorte, je crois que je finirais par avoir mal à la tête.

Hors ligne

#11 Le 13/05/2019, à 19:29

AGPArchitecture

Re : [RESOLU] simplification ecriture if

Et bien je ne m'attendais pas à ce que ca s'enflamme.

Je prend bonne note que la simplification dépend un peu des personne.

moi c'était pour raccourcir un peu une fonction afin de pouvoir la garder complètement affiché sur l'écran

Hors ligne

#12 Le 14/05/2019, à 11:56

erresse

Re : [RESOLU] simplification ecriture if

T'inquiète... On est loin d'une discussion enflammée ici ! tongue
Mais, effectivement, tout le monde n'est pas du même avis s'agissant de la bonne manière d'écrire un programme, et même une même personne peut rédiger de façon différente suivant le programme à écrire ou le langage utilisé, alors...
Le plus important, c'est d'abord que ça fonctionne, ensuite selon le cas, que ce soit plus facile à maintenir dans le temps, ou plus performant à l'exécution quitte à être plus obscur.
big_smile


Plus de 50 ans d'informatique, ça en fait des lignes de commandes en console, mais on n'avait pas le choix...
Excellente raison pour, aujourd'hui qu'on le peut, utiliser au maximum les INTERFACES GRAPHIQUES !
Important : Une fois résolu, pensez à clore votre sujet en ajoutant [Résolu] devant le titre du 1er message, et un bref récapitulatif de la solution à la fin de celui-ci. Merci.

Hors ligne

#13 Le 05/06/2019, à 19:25

kamaris

Re : [RESOLU] simplification ecriture if

Comme j'aimais bien la formulation donnée par @pingouinux en #4, et même plus encore celle avec test donnée par @Watael en #8, je l'ai mise dans un script. L'excellent Shellcheck m'a alors signalé que cette formulation n'était pas équivalente à un if-then-else, car

Shellcheck a écrit :

Note that A && B || C is not if-then-else. C may run when A is true.

Voir, pour plus de détails, la page concernée sur le wiki de Shellcheck : SC2015.

Je ne sais pas si c'était évident pour les différents intervenants, en particulier @pingouinux et @Watael, mais comme ça ne m'avait pas sauté aux yeux, je le mentionne ici. Lorsqu'il n'y a en B (notation ci-dessus) qu'un echo, ou une commande dont on est à peu près sûr qu'elle renverra true, ça va ; mais sinon, on peut tout à fait avoir des surprises, surtout si en C on a un rm un peu méchant, ou quelque chose du genre…

Hors ligne

#14 Le 05/06/2019, à 19:34

Watael

Re : [RESOLU] simplification ecriture if

[...]comme ça ne m'avait pas sauté aux yeux, je le mentionne ici.

tu fais bien.
je le suggérais en parlant de "condition simple", sans percevoir que cette subtilité pouvait échapper à quelqu'un de moins expérimenté.
mais, en effet, j'aurais dû alerter que condition && faux || autrechose exécute autrechose.


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

Hors ligne