Eu quero saber qual é exatamente a diferença entre
a=$[1+1]
a=$((1+1))
let a=1+1
a=$(expr 1 + 1 )
Todos os 4 atribuem a variável a com 2, mas qual é a diferença?
Pelo que descobri até agora, é que o expr é mais lento porque não é um shell real embutido. Mas nada além disso.
((...))
realmente pode ser usado para tarefas embash
,ksh
ezsh
:n=10; ((n+=10)); echo $n
imprime 20 e((x=1)); echo $x
imprime 1.let
O comando executa avaliação aritmética e é um shell embutido.Execute este comando e você não obtém nada (apenas avalia):
$(( ))
é usado para executar expansão aritmética : leia aquiExecute este e você receberá um erro (devido à expansão):
$[ ]
é a sintaxe antiga para expansão aritmética:expr
é um comando binário, se você deseja fazer uma expansão aritmética em uma subsituação de comando, pode usá-lo:fonte
Como algumas das respostas acima mencionam especificamente
ksh93
, vale a pena notar que ele pode fazer matemática de ponto flutuante, por exemplo:Você pode controlar a precisão da saída com printf, por exemplo:
Pelo menos um argumento deve ser especificado como um número de ponto flutuante como acima. Se ambos forem especificados como números inteiros, somente a matemática inteira será feita, por exemplo:
Isso pode ser útil quando você precisar de matemática de ponto flutuante em um script de shell, pois pode evitar chamar um comando externo.
fonte
zsh
resposta . Desdeksh
ebash
são mais semelhantes entre si (em geral) do que qualquer um ézsh
, parece-me que umakh93
resposta baseada a essa pergunta poderia ser bastante útil.let
não funciona no cron. Eu acho que é devido alet
ter seu próprio ambiente. Use$((...))
uma vez que é POSIX. Por exemplo,no cron, resulta em "x =", mas "x = 3" quando executado a partir do shell.
resulta em "x = 3" em todos os casos.
fonte