Kilka poleceń związanych z arytmetyką, Dash, powłoka POSIX, sh, Przyrost

17

Podczas inkrementacji zmiennej przed / po, w powłoce POSIX, jaka jest różnica między tymi dwoma przykładami. Wydaje się, że miałyby takie same konsekwencje, ale czy byłyby wykorzystywane w inny sposób? Kiedy wolisz jeden od drugiego?

X=$((X+1))

: $((X=X+1))
JM Becker
źródło

Odpowiedzi:

18

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 Xjednej ( $((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.

Alexios
źródło