55 votes

Que fait exactement echo $((2#$1)) ?

Le bash script suivant affiche un nombre décimal lorsqu'on lui donne un nombre binaire.

echo $((2#$1))

Pourquoi exactement ?

Je comprends que $1 est l'entrée. Peut-être 2 est la base (binaire). Mais je n'arrive pas à comprendre la syntaxe utilisée.

75voto

Ipor Sircer Points 3909

Coup d'homme

   echo [-neE] [arg ...]
          Output  the  args,  separated  by spaces, followed by a newline.
          The return status is 0 unless a write error occurs.   If  -n  is
          specified, the trailing newline is suppressed.  If the -e option
          is given,  interpretation  of  the  following  backslash-escaped
          characters  is  enabled.

[...]

   Arithmetic Expansion
       Arithmetic  expansion allows the evaluation of an arithmetic expression
       and the substitution of the result.  The format for  arithmetic  expan
       sion is:

              $((expression))

[...]

   Constants with a leading 0 are interpreted as octal numbers.  A leading
   0x or  0X  denotes  hexadecimal.   Otherwise,  numbers  take  the  form
   [base#]n,  where the optional base is a decimal number between 2 and 64
   representing the arithmetic base, and n is a number in that  base.   If
   base#  is omitted, then base 10 is used.  When specifying n, the digits
   greater than 9 are represented by the lowercase letters, the  uppercase
   letters, @, and _, in that order.  If base is less than or equal to 36,
   lowercase and uppercase letters may be used interchangeably  to  repre
   sent numbers between 10 and 35.

25voto

JugsteR Points 656

La réponse de Ipor est excellent mais très légèrement incomplet. La partie citée de la page du manuel de bash indique que le [_base_#]n ne fonctionne que pour les constantes, et la syntaxe 2#$1 n'est pas une constante. Vous devriez vous demander comment cette vraiment fonctionne !

EXPANSION

L'expansion est effectuée sur la ligne de commande après qu'elle ait été divisée en mots. Il existe sept types d'expansion : expansion des accolades, expansion du tilde, expansion des paramètres et des variables, substitution de commande, expansion arithmétique, la division des mots et l'expansion des noms de chemin.

L'ordre des expansions est le suivant : expansion de l'accolade ; expansion du tilde, expansion des paramètres et des variables, expansion arithmétique, et substitution de commande (de gauche à droite) ; division des mots ; et expansion des noms de chemin.

En fait, Bash procède d'abord à la substitution de variables, de sorte que le fichier $1 est d'abord remplacé par sa valeur. Ce n'est qu'ensuite qu'il effectue une expansion arithmétique, qui ne voit qu'une constante propre.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X