Je veux savoir quelle est exactement la différence entre
a=$[1+1]
a=$((1+1))
let a=1+1
a=$(expr 1 + 1 )
Tous les 4 attribuent la variable a à 2, mais quelle est la différence?
D'après ce que j'ai découvert jusqu'à présent, c'est que expr est plus lent car ce n'est pas un véritable shell intégré. Mais rien de plus que cela.
((...))
en fait, peut être utilisé pour des affectations dansbash
,ksh
etzsh
:n=10; ((n+=10)); echo $n
imprime 20 et((x=1)); echo $x
imprime 1.let
La commande effectue une évaluation arithmétique et est un shell intégré.Exécutez cette commande et vous n'obtenez rien (n'évalue que):
$(( ))
est utilisé pour effectuer une expansion arithmétique : lire iciExécutez celui-ci et vous obtiendrez une erreur (en raison de l'expansion):
$[ ]
est l'ancienne syntaxe pour l'expansion arithmétique:expr
est une commande binaire, si vous voulez faire une expansion arithmétique dans une sous-position de commande, vous pouvez l'utiliser:la source
Étant donné que certaines des réponses ci-dessus mentionnent spécifiquement,
ksh93
il convient de noter qu'il peut effectuer des calculs en virgule flottante, par exemple:Vous pouvez contrôler la précision de la sortie avec printf, par exemple:
Au moins un argument doit être spécifié comme un nombre à virgule flottante comme ci-dessus. Si les deux sont spécifiés comme des nombres entiers, seuls les calculs de nombres entiers sont effectués, par exemple:
Cela peut être utile lorsque vous avez besoin de mathématiques à virgule flottante dans un script shell, car vous pouvez éviter d'appeler une commande externe.
la source
zsh
réponse . Depuisksh
etbash
sont plus semblables les uns aux autres (en général) que ce soit est àzsh
, il me semble qu'unekh93
réponse à cette question à base pourrait être très utile.let
ne fonctionne pas en cron. Je pense que cela est dû au fait d'let
avoir son propre environnement. À utiliser$((...))
puisque c'est POSIX. Par exemple,dans cron, résulte en "x =", mais "x = 3" lorsqu'il est exécuté à partir du shell.
résulte dans "x = 3" dans tous les cas.
la source