Re: truc et astuce: bash - Connaissez-vous votre alphabet
Il 23:48, giovedì 21 novembre 2002, Félix Hauri ha scritto: ... la syntaxe: `` $() '' à exactement le même effet que la syntaxe plus ancienne: `` `` ''... hem: $ echo -e `printf \\%03o 97` a $ echo -e $(printf \\%03o 97) a Avec l'avantage d'être imbricable: $ echo -e $(printf \\%03o $(echo 64+26|bc)) Z (Ce qui était impensable avec l'ancienne syntaxe: $ echo -e `printf \\%03o `echo 64+26|bc`` (standard_in) 1: illegal character: ^@ (standard_in) 1: parse error Pas totalement vrai, tu peux l'imbriquer, mais ça fait pas propre: $ echo -e `printf \\%03o \`echo 64+26|bc\`` Z surtout quand tu à trois ou quattres imbrications différentes avec peut être des autres string à l'intérieur. Avant de connaître la syntaxe $() j'utilisais uniquement `` et je suis arrivé dans certains scripts à avoir jusqu'à 10 \ consécutifs, carrement illisible. ciao, Leo -- Le privilège des grands, c'est de voir les catastrophes d'une terrasse. - Giraudoux -- http://www-internal.alphanet.ch/linux-leman/ avant de poser une question. Ouais, pour se désabonner aussi.
Re: truc et astuce: bash - Connaissez-vous votre alphabet
Surlignage Pierre Maitre [EMAIL PROTECTED]: [maitre@anesth1 tmp]$ echo -e $(\141) bash: 141: command not found Là je comprends plus essaie echo \141 @++ JC -- http://www-internal.alphanet.ch/linux-leman/ avant de poser une question. Ouais, pour se désabonner aussi.
Re: truc et astuce: bash - Connaissez-vous votre alphabet
Pierre Maitre wrote: Bonsoir J'ai un problème avec le petit script de Félix. Ca m'est tombé dessus en bidouillant sur la ligne de commande pour essayer de comprendre ce que faisait le printf: [maitre@anesth1 tmp]$ i=97 [maitre@anesth1 tmp]$ printf \\%3o\n $i \141 [maitre@anesth1 tmp]$ echo -e $(printf \\%3o $i) a Jusque là, pas de problème, mais maintenant je substitue: [maitre@anesth1 tmp]$ echo -e $(\141) bash: 141: command not found Là je comprends plus man bash dit (entre autre) : A non-quoted backslash (\) is the escape character. It preserves the literal value of the next character that follows Donc «\1» signifie «1», donc «\141» signifie «141» et $(\141) signifie $(141). Ceci est censé être remplacé par la sortie de la commande «141», mais elle n'existe pas ! Note: «echo -e $(printf \\%3o $i)» est plus équivalent à «echo -e \\141». Certes le printf ne produit qu'un seul «\» mais man bash dit encore : When the old-style backquote form of substitution is used, backslash retains its literal meaning except when followed by $, `, or \. The first backquote not preceded by a backslash terminates the command substitution. When using the $(command) form, all characters between the parenthe- ses make up the command; none are treated specially. Marc Mongenet -- http://www-internal.alphanet.ch/linux-leman/ avant de poser une question. Ouais, pour se désabonner aussi.
Re: truc et astuce: bash - Connaissez-vous votre alphabet
On Thu, 21 Nov 2002, Pierre Maitre wrote: Félix Hauri a écrit : Mais permet de bien s'amuser quand même: $ echo -e $( for ((i=97;91-$i;i=$i+1)) do --- ne manque-t-il pas un point virgule: for ((i=97;91-$i;i=$i+1)) ; do Oui, mais non... Dans le principe et pour ce que je me souvienne avoir appris tu as raison. Cela dit syntaxiquement parlant, sans le point-virgule, cela se comprend sans équivoque, de plus avec ma version de bash cela fonctionne farpaitement;) $ echo $BASH_VERSION 2.05a.0(1)-release A noter que pour mes mails, j'utilise énormement le copier-coller, cela évite les fôtes. [ $i -lt 123 ] || i=65 printf \\%03o $i done ) Bonsoir J'ai un problème avec le petit script de Félix. Ca m'est tombé dessus en bidouillant sur la ligne de commande pour essayer de comprendre ce que faisait le printf: Dans le script, je m'en sers pour générer de l'octal. [maitre@anesth1 tmp]$ i=97 [maitre@anesth1 tmp]$ printf \\%3o\n $i \141 [maitre@anesth1 tmp]$ echo -e $(printf \\%3o $i) a Jusque là, pas de problème, mais maintenant je substitue: [maitre@anesth1 tmp]$ echo -e $(\141) la syntaxe: `` $() '' à exactement le même effet que la syntaxe plus ancienne: `` `` ''... hem: $ echo -e `printf \\%03o 97` a $ echo -e $(printf \\%03o 97) a Avec l'avantage d'être imbricable: $ echo -e $(printf \\%03o $(echo 64+26|bc)) Z (Ce qui était impensable avec l'ancienne syntaxe: $ echo -e `printf \\%03o `echo 64+26|bc`` (standard_in) 1: illegal character: ^@ (standard_in) 1: parse error (à ne pas confondre avec $'' que je n'ai pas utilisé ici car les apostrophes interdisent le passage des variables.) -- Félix Hauri - [EMAIL PROTECTED] - http://www.f-hauri.ch -- http://www-internal.alphanet.ch/linux-leman/ avant de poser une question. Ouais, pour se désabonner aussi.
Re: truc et astuce: bash - Connaissez-vous votre alphabet
On Thu, 21 Nov 2002, Jean-Claude Schopfer wrote: Surlignage Pierre Maitre [EMAIL PROTECTED]: [maitre@anesth1 tmp]$ echo -e $(\141) bash: 141: command not found Là je comprends plus essaie echo \141 Sous bash, il faut demander à echo d'exécuter les échappements paramètre ``-e'' $ echo -e \141 a mais aussi sans les guillemets: $ echo -e \\141 a Ou encore: $ echo $'\141' a J'aime beaucoup cette dernière syntaxe parce qu'elle permet d'utiliser les échapement avec n'importe quelle commande. (Ce n'est pas echo qui execute l'echappement mais l'interface bash AVANT le passage du paramètre à la commande echo.) -- Félix Hauri - [EMAIL PROTECTED] - http://www.f-hauri.ch -- http://www-internal.alphanet.ch/linux-leman/ avant de poser une question. Ouais, pour se désabonner aussi.
Re: truc et astuce: bash - Connaissez-vous votre alphabet
Félix Hauri a écrit : Cela dit syntaxiquement parlant, sans le point-virgule, cela se comprend sans équivoque, de plus avec ma version de bash cela fonctionne farpaitement;) $ echo $BASH_VERSION 2.05a.0(1)-release mais pas chez moi: bash: command substitution: line 2: syntax error near unexpected token `do' Avec point virgule, il n'y a pas d'erreur. $ echo $BASH_VERSION 2.04.11(1)-release Merci à tous pour les explications Pierre Maitre -- Dr Pierre-O. Maitre Privat Docent FMH Anesthésiologie FMH Pharmacologie Clinique Cabinet médical / A la Joy CH-1272 Genolier Switzerland -- http://www-internal.alphanet.ch/linux-leman/ avant de poser une question. Ouais, pour se désabonner aussi.
truc et astuce: bash - Connaissez-vous votre alphabet
Après: $ for i in $( seq 10 -1 1 ) ; do echo $i;done Le bash permet de faire des boucles de ce genre: $ for (( i=10 ; $i ; i=$i-1 )) ; do echo $i;done Ce n'est pas plus court, mais cela ne fait pas appel ``seq''. Explication: La première expression ( i=10 ) n'est éxecutée qu'une fois au début. Lorsque le résultat de la deuxième expression est zéro, la boucle est terminée, sinon la troisième expression est executée... Ce n'est même pas plus rapide: $ ( export TIMEFORMAT=%R; time for (( i=5000; $i ;i=$i-1));do :;done ) 4.087 $ ( export TIMEFORMAT=%R; time for i in $(seq 5000 -1 1);do :;done ) 1.688 Mais permet de bien s'amuser quand même: $ echo -e $( for ((i=97;91-$i;i=$i+1)) do [ $i -lt 123 ] || i=65 printf \\%03o $i done ) -- Félix Hauri - [EMAIL PROTECTED] - http://www.f-hauri.ch -- http://www-internal.alphanet.ch/linux-leman/ avant de poser une question. Ouais, pour se désabonner aussi.