2010-03-10 2 views
23

Je viens trébuché sur la syntaxe bash:

foo=42 
bar=$[foo+1] # evaluates an arithmetic expression 

Quand je googlé pour cela, je l'ai trouvé http://tldp.org/LDP/Bash-Beginners-Guide/html/sect_03_04.html#sect_03_04_05 :

3.4.6. Développement arithmétique

L'expansion arithmétique permet l'évaluation d'une expression arithmétique et la substitution du résultat. Le format de l'expansion arithmétique est:

$((EXPRESSION)) 

...

la mesure du possible, les utilisateurs de Bash devraient essayer d'utiliser la syntaxe avec des crochets:

$[ EXPRESSION ] 

Cependant, cela ne calcule la résultat de l'expression, et ne pas de tests ...

Dans ma page man bash je ne peux trouver le $((EXPRESSION)) forme telle que:

foo=42 
bar=$((foo+1)) # evaluates an arithmetic expression 

Alors, que les tests ne sont pas effectués avec $[...] que faire avec $((...)), ou est le $[...] juste une ancienne version de $((...))?

+1

Pour une perspective historique, voir http://stackoverflow.com/a/40048865/2908724. – bishop

Répondre

29

La page de manuel pour bash v3.2.48 dit:

[...] Le format d'expansion arithmétique est:

 $((expression)) 

Le ancien format $ [expression] est dépréciée et sera supprimé dans les prochaines versions de bash.

Donc $[...] est l'ancienne syntaxe qui ne devrait plus être utilisée.

+5

Notez que le texte exact n'est pas dans [* la page de manuel bash] (http://tiswww.case.edu/php/chet/bash/bash.html), il est dans * quelques * pages de manuel bash (par exemple [Debian corrigez ceci] (http://patch-tracker.debian.org/patch/series/view/bash/4.1-3/man-arithmetic.dpatch)). La fonctionnalité a été dépréciée depuis bash-2.0, mais persiste aujourd'hui (bash-4.2). –

9

@sth est entièrement correct. Et dans le cas où vous êtes curieux de savoir pourquoi une syntaxe plus verbeuse est maintenant en faveur, consultez cet ancien e-mail de la liste de diffusion.

http://lists.gnu.org/archive/html/bug-bash/2012-04/msg00033.html

« Dans les premières propositions, une forme $ [expression] a été utilisé. Il était fonctionnellement équivalent au "$ (())" du texte courant, mais les objections ont été déposées que le 1988 KornShell avait déjà implémenté "$ (())" et il n'y avait aucune raison impérieuse d'inventer encore une autre syntaxe . En outre, le « $ [] » syntaxe avait une incompatibilité mineure impliquant les motifs dans les déclarations de cas. »

Je ne suis pas sûr que j'aime la raison d'être « mais quelqu'un a déjà fait plus verbeux, » mais vous l'avez, peut-être le problème de déclaration de cas était plus convaincant que j'imagine de cette mention obscure?