Cosa fa esattamente echo $ ((2 # $ 1))?


53

Il seguente script bash mostra un numero decimale quando viene dato un numero binario.

echo $((2#$1))

Perché esattamente?

Capisco che $1è l'input. Forse 2è la base (binaria). Ma non riesco a capire la sintassi utilizzata.

Risposte:


72

uomo 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.

66
-1 per la spiegazione ZERO.
Max Ried

27
Penso che sia abbastanza ben spiegato
NanoPish,

19
Rispondere completamente a una domanda, anche se "solo" curando la documentazione esistente, non merita -1 per me. In particolare se tale documentazione è la manpage di bash.
YoungFrog,

31
man bash | wcindica che la pagina man [GNU bash, versione 3.2.57] deve essere 4890 righe, 37094 parole , 329778 caratteri. Questa risposta lo riduce a sole 7 righe, 176 parole , 1115 caratteri rilevanti. Penso che quella risposta meriti il ​​tuo voto. (come fa questo commento ;-)
Bruno Bronosky

7
@MaxRied: -1 al tuo commento per la ricerca di lanugine inutili
Mehrdad,

30

Dal documento a: https://tiswww.case.edu/php/chet/bash/bashref.html#Shell-Arithmetic

Le costanti con uno 0 iniziale sono interpretate come numeri ottali. Un '0x' o '0X' iniziale indica esadecimale. Altrimenti, i numeri assumono la forma [base #] n, dove la base opzionale è un numero decimale compreso tra 2 e 64 che rappresenta la base aritmetica e n è un numero in quella base. Se la base # viene omessa, viene utilizzata la base 10. Quando si specifica n, le cifre maggiori di 9 sono rappresentate dalle lettere minuscole, dalle lettere maiuscole, '@' e '_', in questo ordine. Se la base è inferiore o uguale a 36, ​​le lettere minuscole e maiuscole possono essere utilizzate in modo intercambiabile per rappresentare numeri compresi tra 10 e 35.

Quindi echo $((16#FF))uscite 255e echo $((2#0110))uscite6


25

La risposta di Ipor è eccellente ma leggermente incompleta. La parte citata della pagina man di bash afferma che la sintassi funziona solo per le costanti e non è una costante. Dovresti chiedere come funziona davvero ![base#]n2#$1

ESPANSIONE

    L'espansione viene eseguita sulla riga di comando dopo che è stata suddivisa in parole. Esistono sette tipi di espansione: espansione di parentesi graffe, espansione di tilde, espansione di parametri e variabili, sostituzione di comandi, espansione aritmetica, divisione di parole ed espansione di nomi di percorso.

    L'ordine delle espansioni è: espansione delle parentesi graffe; espansione della tilde, espansione di parametri e variabili, espansione aritmetica e sostituzione dei comandi (eseguita da sinistra a destra); divisione delle parole; e l'espansione del nome percorso.

Fondamentalmente Bash sta effettuando prima la sostituzione variabile, quindi il $1primo viene sostituito con il suo valore. Solo allora fa l'espansione aritmetica, che vede solo una costante propria.


Questo sembra inutile; l'OP dice "Capisco che $1è l'input".
Scott

8
+1 perché comprendere l'ordine di espansione è molto utile per dare un senso a molte espressioni Bash diverse.
Anthony G - giustizia per Monica

1
Questo avrebbe potuto essere semplicemente un commento alla risposta di Ipor.
Chepner

1
@chepner Per favore, prova a spremere quel blockquote ben formattato in un commento :-)
Alexander

1
"Si noti che il parametro $1viene espanso per produrre una costante intera prima che venga valutata l'espressione aritmetica. Vedere gnu.org/software/bash/manual/bash.txt , sezione 3.5"
chepner
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.