W pierwszym przykładzie $((X+1))
ocenia wyrażenie X + 1 i rozwija się do wyniku, który jest następnie przypisywany do zmiennej.
W drugim przykładzie $((X=X+1))
przyrosty X
jednej ( $((X++))
również ważne i krótsze, ale niekoniecznie obsługiwane przez powłokę), a następnie rozszerza się do nowej wartości $X
, która jest pierwszym argumentem polecenia zerowej, :
. Polecenie null ignoruje argumenty, a wynik jest odrzucany (ze skutkami ubocznymi).
Wolałbym osobiście pierwszą formę z trzech (względnie subiektywnych) powodów:
- Polecenie zerowe jest niejasne i niezrozumiane, na co wskazuje fakt, że często jest tu przedmiotem niejasnych pytań.
- Pierwsza forma wydaje się bardziej naturalna pod względem ogólnej gramatyki powłoki, a nawet trochę przypomina stary styl oceny.
- Pierwsza forma jest bardziej przejrzysta i zwięzła i nie wymaga polecenia.
Musisz użyć pierwszej wersji, jeśli modyfikujesz środowisko tylko jednego polecenia
X=$((X+1)) /usr/local/bin/something
Będziesz musiał użyć drugiego formularza, aby dodać ocenę bezpośrednio do argumentów:
ls -la "file-$((X++))" # or ...
ls -la "file-$((X=X+1))" # for better compatibility
Ma to pożądane skutki uboczne, zapisuje jedną linię i jest całkiem jasne.