Risposte:
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.
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 ;-)
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
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.
$1è l'input".
$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"