Was genau macht echo $((2#$1))?

Was genau macht echo $((2#$1))?

Das folgende Bash-Skript zeigt eine Dezimalzahl an, wenn eine Binärzahl angegeben wird.

echo $((2#$1))

Warum genau?

Ich verstehe, dass das $1die Eingabe ist. Vielleicht 2ist es die Basis (binär). Aber ich verstehe die verwendete Syntax nicht.

Antwort1

Mann bash

   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.

Antwort2

Aus dem Dokument unter:https://tiswww.case.edu/php/chet/bash/bashref.html#Shell-Arithmetic

Konstanten mit einer führenden 0 werden als Oktalzahlen interpretiert. Ein führendes „0x“ oder „0X“ bedeutet hexadezimal. Andernfalls haben die Zahlen die Form [Basis#]n, wobei die optionale Basis eine Dezimalzahl zwischen 2 und 64 ist, die die arithmetische Basis darstellt, und n eine Zahl in dieser Basis ist. Wenn Basis# weggelassen wird, wird Basis 10 verwendet. Bei der Angabe von n werden die Ziffern größer als 9 durch Kleinbuchstaben, Großbuchstaben, „@“ und „_“ in dieser Reihenfolge dargestellt. Wenn die Basis kleiner oder gleich 36 ist, können Klein- und Großbuchstaben austauschbar verwendet werden, um Zahlen zwischen 10 und 35 darzustellen.

Also echo $((16#FF))Ausgänge 255und echo $((2#0110))Ausgänge6

Antwort3

Ipors Antwortist ausgezeichnet, aber ein wenig unvollständig. Der zitierte Teil der Bash-Manpage besagt, dass die Syntax nur für Konstanten funktioniert und keine Konstante ist. Sie sollten fragen, wie das[base#]n2#$1Wirklichfunktioniert!

ERWEITERUNG

    Die Erweiterung wird in der Befehlszeile durchgeführt, nachdem diese in Wörter aufgeteilt wurde. Es gibt sieben Arten der Erweiterung: Klammernerweiterung, Tilde-Erweiterung, Parameter- und Variablenerweiterung, Befehlsersetzung, arithmetische Erweiterung, Wortaufteilung und Pfadnamenerweiterung.

    Die Reihenfolge der Erweiterungen ist: Klammernerweiterung, Tilde-Erweiterung, Parameter- und Variablenerweiterung, arithmetische Erweiterung und Befehlsersetzung (von links nach rechts durchgeführt), Worttrennung und Pfadnamenerweiterung.

Grundsätzlich führt Bash zuerst eine Variablensubstitution durch, sodass $1zuerst durch den entsprechenden Wert ersetzt wird. Erst dann führt es eine arithmetische Erweiterung durch, die nur eine echte Konstante erkennt.

verwandte Informationen