|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||
|
Membre confirmé
![]() Inscription : avril 2008 Messages : 188 ![]() |
Bon, la dernière fois, j'avais un souci avec le ksh d'AIX; maintenant, c'est avec celui de HP-UX :-(
Contrairement à linux, le ksh d'HP-UX semble ne pas reconnaître le bang ('!') devant une expression... sous Linux: Code :
Sous HP-UX: Code :
Par exemple, dois-je convertir (avec une bonne vieille macro emacs) mes tests: Code :
if ! fgrep -q 'blabla' file ; then blabla ; fi Code :
if fgrep -q 'blabla' file ; [[ $? -eq 0 ]] ; then blabla ; fi Code :
if [[ ! "x$a" = "x$b" ]] ; then ... fi Code :
if ! [[ "x$a" = "x$b" ]] ; then ... fi Merci d'avance )jack( |
||||
|
|
00
|
|
|
#2 |
|
Expert Confirmé Sénior
![]() francois Ingénieur systèmes et réseaux Inscription : juillet 2006 Messages : 3 538 ![]() |
"!" n'est pas une fonction standard c'est donc normal de ne pas la trouver systématiquement sur tous les interpreteurs ksh.
|
|
|
20
|
|
|
#3 | ||
|
Expert Confirmé Sénior
![]() Frédéric Ingénieur développement logiciels Inscription : février 2006 Messages : 3 055 ![]() |
Citation:
D'un point de vue lisibilité pure, mettre "if grep" alors que le if s'applique en réalité à l'évaluation $? -eq 0 est déroutant Code :
fgrep -q 'blabla' file ; if [[ $? -eq 0 ]] ; then blabla ; fi Code :
if fgrep -q 'blabla' file ; then true; else blabla ; fi Citation:
Et mettre "x" dans les deux expressions est inutile vu qu'elles sont entre guillemets
__________________
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche. Tout ce qu'un individu reçoit sans rien faire pour l'obtenir, un autre individu a dû travailler pour le produire sans en tirer profit. Tout Pouvoir ne peut distribuer aux uns que ce qu'il a préalablement confisqué à d'autres car on n'accroît pas les biens en les divisant. Quand la moitié d'un peuple croit qu'il ne sert à rien de faire des efforts car l'autre moitié les fera pour elle, et quand cette dernière moitié se dit qu'il ne sert à rien d'en faire car ils bénéficieront à d'autres, cela s'appelle le déclin et la fin d'une nation. Dr. Adrian Rogers, 1931 |
||
|
|
00
|
|
|
#4 | ||
|
Membre confirmé
![]() Développeur informatique Inscription : octobre 2006 Messages : 181 ![]() |
Personnellement j'aime bien la syntaxe suivante :
Code :
|
||
|
|
01
|
|
|
#5 | ||||||||
|
Membre confirmé
![]() Inscription : avril 2008 Messages : 188 ![]() |
Bonjour,
Citation:
Pour moi, j'ai plutôt tendance à réserver le '&&' et le '||' pour combiner des valeurs logiques et non comme structure de contrôle. C'est comme: Code :
Code :
Citation:
)jack( |
||||||||
|
|
00
|
|
|
#6 | ||||||
|
Membre confirmé
![]() Inscription : avril 2008 Messages : 188 ![]() |
Citation:
Si j'ai une fonction dont la nature est d'être un prédicat, c'est-à-dire qu'elle fait un test (sans effet de bord) et retourne un booléen, je m'attends a priori à pouvoir l'utiliser dans la clause conditionnelle d'un "if". Citation:
De plus, si on n'utilise pas les doubles crochets, on a un problème méta-circulaire, car Code :
fgrep -q 'blabla' file ; if [ $? -eq 0 ] ; then blabla ; fi Code :
fgrep -q 'blabla' file ; if test $? -eq 0 ; then blabla ; fi Code :
fgrep -q 'blabla' file ; test $? -eq 0 ; if [ $? -eq 0 ]; then blabla ; fi Code :
fgrep -q 'blabla' file ; test $? -eq 0 ; test $? -eq 0 ; if [ $? -eq 0 ]; then blabla ; fi A priori, quand je programme, je m'attends à ce que la valeur de retour d'un prédicat soit dans la pile d'appel et non dans une variable spéciale! De plus, cela oblige à savoir que 0 est la valeur vraie (ce qui est assez contraire à l'habitude prise en mathématiques!), alors que l'appel imbriqué permet justement de se passer de ça. Peut-être est-ce une déformation due à plus de 25 ans de programmation fonctionnelle... Citation:
Par exemple, j'ai un bout de code qui fait (ou faisait): Code :
Personnellement, je n'ai pas de mal à (re)lire et comprendre ce bout de code. Et ce n'est pas très commode de se passer du "!" dans ce genre de code car, du coup, il faut séparer les appels des prédicats du test de leur valeur de retour, ce qui fait que le code est de plus en plus indenté au fur et à mesure des tests. Beurk! Bon, c'est vrai que, dans ce cas précis, compte-tenu du "return" dans chaque clause, on pourrait faire plusieurs "if" et fermer par un "fi" après chaque "return". Citation:
Cela dit, merci quand même pour tes réponses. Je vais réécrire mon code en me passant du bang! )jack( |
||||||
|
|
00
|
|
|
#7 | ||||||||||||||
|
Expert Confirmé Sénior
![]() Frédéric Ingénieur développement logiciels Inscription : février 2006 Messages : 3 055 ![]() |
Citation:
Citation:
D'où une écriture un peu plus carrée (oserais-je dire "scolaire" ?) qui est de 1) exécuter la commande 2) vérifier son code d'état ce qui permet d'inverser facilement le 2 Et on peut même renforcer la robustesse en capturant le code d'état ce qui permet d'insérer des echo de debug intermédiaire Code bash :
Citation:
)Code bash :
![]() Exemple: test année bissextile puis test année non bissextile Code bash :
![]() Citation:
Code bash :
__________________
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche. Tout ce qu'un individu reçoit sans rien faire pour l'obtenir, un autre individu a dû travailler pour le produire sans en tirer profit. Tout Pouvoir ne peut distribuer aux uns que ce qu'il a préalablement confisqué à d'autres car on n'accroît pas les biens en les divisant. Quand la moitié d'un peuple croit qu'il ne sert à rien de faire des efforts car l'autre moitié les fera pour elle, et quand cette dernière moitié se dit qu'il ne sert à rien d'en faire car ils bénéficieront à d'autres, cela s'appelle le déclin et la fin d'une nation. Dr. Adrian Rogers, 1931 |
||||||||||||||
|
|
00
|
|
|
#8 | |||||||||||||
|
Membre confirmé
![]() Inscription : avril 2008 Messages : 188 ![]() |
Citation:
Citation:
Citation:
Tiens, au passage, avez-vous testé ceci: Code :
Amusant, non? Citation:
Citation:
Code sh :
)jack( |
|||||||||||||
|
|
00
|
|
|
#9 | |||
|
Expert Confirmé
![]() Inscription : janvier 2011 Messages : 970 ![]() |
Salut,
Citation:
__________________
$ man woman Il n'y a pas de page de manuel pour woman. |
|||
|
|
10
|
|
|
#10 | |||
|
Expert Confirmé Sénior
![]() Frédéric Ingénieur développement logiciels Inscription : février 2006 Messages : 3 055 ![]() |
Arf tu ne peux pas, en toute honnêteté, reprocher au shell de ne pas avoir en lui une évolution qui n'a été amenée que plus tard !!! Ca te manque certes (bien qu'on puisse toujours s'en passer) mais on ne peut pas le reprocher ; on ne peut que le regretter...
Citation:
__________________
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche. Tout ce qu'un individu reçoit sans rien faire pour l'obtenir, un autre individu a dû travailler pour le produire sans en tirer profit. Tout Pouvoir ne peut distribuer aux uns que ce qu'il a préalablement confisqué à d'autres car on n'accroît pas les biens en les divisant. Quand la moitié d'un peuple croit qu'il ne sert à rien de faire des efforts car l'autre moitié les fera pour elle, et quand cette dernière moitié se dit qu'il ne sert à rien d'en faire car ils bénéficieront à d'autres, cela s'appelle le déclin et la fin d'une nation. Dr. Adrian Rogers, 1931 |
|||
|
|
00
|
|
|
#11 | ||
|
Membre confirmé
![]() Inscription : avril 2008 Messages : 188 ![]() |
Citation:
Je regrette simplement que les concepteurs d'origine n'y aient pas pensé (plus tôt)! Citation:
Dans ce cas, le "x" (sans guillemets) marche aussi bien que les guillemets, mais n'est pas indispensable. Je ne me souviens plus du tout, mais il est tout à fait possible que ce soit non pas un problème du shell lui-même, mais un problème de "test", c'est-à-dire qu'il ne se produise non pas avec "[[...]]" mais avec "[...]" ou "test ...", et uniquement pour certaines versions de "test" moins "intelligentes" que celle disponible sous linux. )jack( |
||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com