Poniższy skrypt bash wyświetla liczbę dziesiętną po podaniu liczby binarnej.
echo $((2#$1))
Dlaczego dokładnie
Rozumiem, że $1
to jest wkład. Może 2
jest bazą (binarną). Ale nie rozumiem zastosowanej składni.
uderzenie człowieka
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.
man bash | wc
wskazuje stronę podręcznika [GNU bash, wersja 3.2.57] na 4890 linii, 37094 słów , 329778 znaków. Ta odpowiedź usuwa tylko 7 wierszy, 176 słów i 1115 znaków. Myślę, że ta odpowiedź zasługuje na twoją opinię. (podobnie jak ten komentarz ;-)Z dokumentu pod adresem : https://tiswww.case.edu/php/chet/bash/bashref.html#Shell-Arithmetic
Więc
echo $((16#FF))
wyjścia255
iecho $((2#0110))
wyjścia6
źródło
Odpowiedź Iporta jest doskonała, ale bardzo nieznacznie niepełna. Cytowana część strony podręcznika bash mówi, że składnia działa tylko dla stałych i nie jest stała. Powinieneś zapytać, jak to naprawdę działa!
[base#]n
2#$1
Zasadniczo Bash najpierw wykonuje podstawienie zmiennych, aby
$1
najpierw zastąpić je swoją wartością. Dopiero wtedy dokonuje ekspansji arytmetycznej, która widzi tylko odpowiednią stałą.źródło
$1
to jest wkład”.$1
jest rozszerzany, aby uzyskać stałą całkowitą przed obliczeniem wyrażenia arytmetycznego. Zobacz gnu.org/software/bash/manual/bash.txt , sekcja 3.5”