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.
Répondre pleinement à une question, même si "seulement" en conservant la documentation existante, ne mérite pas -1 pour moi. En particulier si cette documentation est la page de manuel de bash.
YoungFrog
31
man bash | wcindique que la page de manuel [GNU bash, version 3.2.57] comporte 4890 lignes, 37094 mots , 329778 caractères. Cette réponse supprime la liste en 7 lignes, 176 mots , 1115 caractères pertinents. Je pense que cette réponse mérite votre vote positif. (comme le fait ce commentaire ;-)
Bruno Bronosky le
7
@MaxRied: -1 à votre commentaire pour chercher des peluches inutiles
Les constantes avec un 0 au début sont interprétées comme des nombres octaux. Un «0x» ou un «0X» en tête indique hexadécimal. Sinon, les nombres prennent la forme [base #] n, où la base optionnelle est un nombre décimal compris entre 2 et 64 représentant la base arithmétique, et n est un nombre dans cette base. Si la base # est omise, la base 10 est utilisée. Lorsque vous spécifiez n, les chiffres supérieurs à 9 sont représentés par les lettres minuscules, les lettres majuscules, "@" et "_", dans cet ordre. Si la base est inférieure ou égale à 36, les lettres minuscules et majuscules peuvent être utilisées indifféremment pour représenter des nombres compris entre 10 et 35.
Donc, les echo $((16#FF))sorties 255et les echo $((2#0110))sorties6
La réponse d'Ipor est excellente mais très légèrement incomplète. La partie citée de la page de manuel bash indique que la syntaxe ne fonctionne que pour les constantes et qu’elle n’est pas une constante. Vous devriez vous demander comment cela fonctionne vraiment ![base#]n2#$1
EXPANSION
L'expansion est effectuée sur la ligne de commande après que celle-ci ait été scindée en mots. Il existe sept types d’expansion réalisés: expansion par accolade, expansion par tilde, expansion par paramètre et par variable, substitution de commande, expansion par arithmétique, division de mot et extension par chemin.
L'ordre des extensions est le suivant: expansion tilde, expansion de paramètre et de variable, expansion arithmétique et substitution de commande (effectuée de gauche à droite); division de mots; et extension du chemin.
Fondamentalement, Bash effectue la substitution de variable en premier, de sorte que le $1est d'abord remplacé par sa valeur. Ce n’est qu’alors qu’il fait une expansion arithmétique, qui ne voit qu’une constante appropriée.
Cela semble inutile. le PO dit: "Je comprends que $1c'est la contribution."
Scott
8
+1 car la compréhension de l'ordre d'expansion est très utile pour donner un sens à de nombreuses expressions Bash différentes.
Anthony G - justice pour Monica le
1
Cela aurait simplement pu être un commentaire sur la réponse d'Ipor.
Chepner
1
@chepner S'il vous plaît, essayez de rédiger ce commentaire de bloc bien formaté dans un commentaire :-)
Alexander
1
"Notez que le paramètre $1est développé pour produire une constante entière avant l'évaluation de l'expression arithmétique. Voir gnu.org/software/bash/manual/bash.txt , section 3.5"
man bash | wc
indique que la page de manuel [GNU bash, version 3.2.57] comporte 4890 lignes, 37094 mots , 329778 caractères. Cette réponse supprime la liste en 7 lignes, 176 mots , 1115 caractères pertinents. Je pense que cette réponse mérite votre vote positif. (comme le fait ce commentaire ;-)Du Doc à: https://tiswww.case.edu/php/chet/bash/bashref.html#Shell-Arithmetic
Donc, les
echo $((16#FF))
sorties255
et lesecho $((2#0110))
sorties6
la source
La réponse d'Ipor est excellente mais très légèrement incomplète. La partie citée de la page de manuel bash indique que la syntaxe ne fonctionne que pour les constantes et qu’elle n’est pas une constante. Vous devriez vous demander comment cela fonctionne vraiment !
[base#]n
2#$1
Fondamentalement, Bash effectue la substitution de variable en premier, de sorte que le
$1
est d'abord remplacé par sa valeur. Ce n’est qu’alors qu’il fait une expansion arithmétique, qui ne voit qu’une constante appropriée.la source
$1
c'est la contribution."$1
est développé pour produire une constante entière avant l'évaluation de l'expression arithmétique. Voir gnu.org/software/bash/manual/bash.txt , section 3.5"