Re: truc et astuce: bash - Connaissez-vous votre alphabet

2002-11-23 Par sujet Leopoldo Ghielmetti
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

2002-11-21 Par sujet Jean-Claude Schopfer
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

2002-11-21 Par sujet Marc Mongenet
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

2002-11-21 Par sujet Félix Hauri
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

2002-11-21 Par sujet Félix Hauri
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

2002-11-21 Par sujet Pierre Maitre
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

2002-11-16 Par sujet Félix Hauri
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.