de a à z

Vincent Lefevre vincent at vinc17.org
Fri Dec 15 13:51:21 CET 2006


On 2006-12-15 11:59:51 +0100, Philippe Jacquot wrote:
> for i in $(seq 97 122); do hex=$(printf %x $i); echo -e "\x"$hex; done

Pas POSIX. En particulier, ça ne fonctionne pas avec dash. C'est un
peu ce que je disais pour

  for i in {97..122}; do printf "\x`printf %x $i`\n"; done

concernant le \x.

D'ailleurs, echo a des comportements très différents suivant les
implémentations, et c'est pour cela qu'on conseille d'utiliser
printf à la place. C'est même dit explicitement par POSIX:

  It is not possible to use echo portably across all POSIX systems
  unless both -n (as the first argument) and escape sequences are
  omitted.
  [...]
  New applications are encouraged to use printf instead of echo.

Cf <http://www.opengroup.org/onlinepubs/009695399/utilities/echo.html>.

Maintenant, ceci semble être portable sous Linux avec n'importe quel
shell:

  for i in $(seq 97 122); do printf "\\`printf %o $i`\n"; done

Cf
  http://www.opengroup.org/onlinepubs/009695399/utilities/printf.html
  http://www.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap05.html

Reste que seq n'est pas POSIX. Linux le fournit (via les coreutils),
mais pas Mac OS X 10.4 (je l'ai juste parce que j'ai installé les
coreutils).

Ceci est, je pense, complètement POSIX:

  i=97
  while [ $i -le 122 ]
  do
    printf "\\`printf %o $i`\n"
    i=$(($i+1))
  done

(on peut aussi l'écrire sur une seule ligne, en utilisant des ";").
Mais avec zsh, si on a activé l'option PRINT_EXIT_VALUE, on se
retrouve avec un "zsh: exit 1" à la fin à cause du test qui échoue.
Ça ne se produit pas avec la construction spéciale [[ ... ]]], mais
cette construction n'est pas POSIX. Cependant, ceci semble OK:

i=97; (while [ $i -le 122 ]; do printf "\\`printf %o $i`\n"; i=$(($i+1)); done)

Mais ce n'est pas pour autant portable dans l'absolu, même avec des
shells que l'on peut croire POSIX: avec zsh 4.2.5, le printf de zsh
(donc celui utilisé par défaut) ne supporte pas la forme \ddd (le
support POSIX n'est donc pas complet). Cela exclut donc un grand
nombre de systèmes si le shell est zsh.

-- 
Vincent Lefèvre <vincent at vinc17.org> - Web: <http://www.vinc17.org/>
100% accessible validated (X)HTML - Blog: <http://www.vinc17.org/blog/>
Work: CR INRIA - computer arithmetic / Arenaire project (LIP, ENS-Lyon)


More information about the Shell mailing list