Chcę wiedzieć, jaka dokładnie jest różnica między
a=$[1+1]
a=$((1+1))
let a=1+1
a=$(expr 1 + 1 )
Wszystkie 4 przypisują zmienną a 2, ale jaka jest różnica?
Z tego, co do tej pory dowiedziałem się, jest to, że wyrażenie jest wolniejsze, ponieważ nie jest to wbudowana powłoka. Ale nic więcej.
((...))
rzeczywiście może być stosowany do zadań wbash
,ksh
izsh
:n=10; ((n+=10)); echo $n
drukuje 20 i((x=1)); echo $x
wydruki 1.let
Komenda wykonuje arytmetyczna oceny i jest wbudowanym poleceniem powłoki.Uruchom to polecenie i nic nie otrzymasz (tylko ocenia):
$(( ))
służy do rozszerzenia arytmetycznego : przeczytaj tutajUruchom ten, a pojawi się błąd (z powodu rozszerzenia):
$[ ]
to stara składnia rozszerzania arytmetycznego:expr
jest poleceniem binarnym, jeśli chcesz wykonać rozszerzanie arytmetyczne w ramach podstawienia polecenia, możesz go użyć:źródło
Ponieważ niektóre z powyższych odpowiedzi wyraźnie wspominają
ksh93
, warto zauważyć, że potrafi wykonywać matematykę zmiennoprzecinkową, np .:Możesz kontrolować precyzję wydruku za pomocą printf, np .:
Co najmniej jeden argument musi być podany jako liczba zmiennoprzecinkowa, jak powyżej. Jeśli oba są określone jako liczby całkowite, wówczas wykonywana jest tylko matematyka liczb całkowitych, np .:
Może to być pomocne, gdy potrzebujesz matematyki zmiennoprzecinkowej w skrypcie powłoki, ponieważ można uniknąć wywoływania polecenia zewnętrznego.
źródło
zsh
odpowiedź . Ponieważksh
ibash
są bardziej do siebie podobne (ogólnie) niż którekolwiek z nichzsh
, wydaje mi się, żekh93
odpowiedź na to pytanie może być bardzo przydatna.let
nie działa w cron. Myślę, że wynika to zlet
posiadania własnego środowiska. Użyj,$((...))
ponieważ jest to POSIX. Na przykład,w cron powoduje „x =”, ale „x = 3” przy uruchomieniu z powłoki.
powoduje „x = 3” we wszystkich przypadkach.
źródło