Journal expressions arithmétiques sur des caractères en shell

Posté par  (site web personnel) .
Étiquettes :
0
7
déc.
2005
dans mes shell scripts, il m'arrive parfois de vouloir effectuer des opérations arithmétiques sur des caractères (comparaisons..) mais comme je fais du pur sh, j'utilise expr. or expr ne fonctionne qu'avec des nombres. j'ai donc cherché un moyen de faire en shell ce que perl fait si facilement:
$ perl -e 'print chr(ord("x")+1);'

j'ai écrit 2 tout petits éxecutables : ord et chr, que je peux utiliser avec expr. l'expression en sh est:
$ echo $(chr $(expr $(ord x) + 1))

pour ceux qui en auraient besoin, les binaires sont ici :

paquet debian i386:
i386_deb
(dépend seulement de libc6)

le source est ici (lgpl):
tar_gz
(dépend donc de libc6-dev)
  • # linuxfr a bouffé les urls :(

    Posté par  (site web personnel) . Évalué à 3.

    paquet debian i386:
    http://brouits.free.fr/share/utils/chrord_0.1-1_i386.deb
    (dépend seulement de libc6)

    le source est ici (lgpl):
    http://brouits.free.fr/share/utils/chrord_0.1.orig.tar.gz
    (dépend donc de libc6-dev)

    Tout homme qui dirige, qui fait quelque chose, a contre lui ceux qui voudraient faire la même chose, ceux qui font précisément le contraire, et surtout la grande armée des gens d'autant plus sévères qu'ils ne font rien du tout. -- Jules Claretie

  • # utilité de chr ?

    Posté par  . Évalué à 1.

    Sachant que echo et printf sont internes à bash, je me demande si un exécutable 'chr' est plus performant que la fonction suivante :
    chr () { echo -e \\0`printf %o $1`; }
    • [^] # Re: utilité de chr ?

      Posté par  . Évalué à 3.

      Il te dis qu'il utilise sh pas bash
    • [^] # ... et utilité de ord ?

      Posté par  (site web personnel) . Évalué à 2.

      printf n'est pas interne à bash, c'est un éxécutable, donc je pense que c'est du kifkif bourricot au niveau rapidité. à part cela, je pense que c'est plus cool d'utiliser ta version avec printf plutôt que mes executables vu que printf est dispo sur plein d'unices. cela évite d'installer chr et ord.
      du coup, voici une version de 'ord' avec des execuitables unix standards:
      ord () { echo -e $(echo -n $1 | od -A n -t dC -) ; }

      Tout homme qui dirige, qui fait quelque chose, a contre lui ceux qui voudraient faire la même chose, ceux qui font précisément le contraire, et surtout la grande armée des gens d'autant plus sévères qu'ils ne font rien du tout. -- Jules Claretie

      • [^] # rapidité

        Posté par  (site web personnel) . Évalué à 1.


        $ time ord x
        real 0m0.002s
        user 0m0.000s
        sys 0m0.001s


        $ time ord.sh x
        real 0m0.029s
        user 0m0.017s
        sys 0m0.006s

        bon, ça se passe de commentaire

        $ time chr 120
        real 0m0.002s
        user 0m0.000s
        sys 0m0.001s


        $ time chr.sh 120
        real 0m0.001s
        user 0m0.001s
        sys 0m0.000s

        par contre, ici c'est comparable

        Tout homme qui dirige, qui fait quelque chose, a contre lui ceux qui voudraient faire la même chose, ceux qui font précisément le contraire, et surtout la grande armée des gens d'autant plus sévères qu'ils ne font rien du tout. -- Jules Claretie

      • [^] # Re: ... et utilité de ord ?

        Posté par  . Évalué à 1.

        man bash -> rubrique 'COMMANDES INTERNES DU SHELL' : tu y trouveras printf

        (merci pour 'od', je ne connaissais pas)
        • [^] # Re: ... et utilité de ord ?

          Posté par  . Évalué à 1.

          • [^] # Re: ... et utilité de ord ?

            Posté par  . Évalué à 3.

            Merci, je sais lire et printf n'est pas exclusif à bash !

            printf est à la fois interne à bash et disponible en tant que programme externe ( /usr/bin/printf )
            Tout comme echo ( /bin/echo )

            Donc pour sh, l'utilisation de printf est ok, et pour bash, on peut imaginer que c'est préférable à chr en terme de performance. Je ne suis donc pas du tout hors sujet.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.