Próbowałem inkrementować zmienną numeryczną przy użyciu obu var=$var+1
i var=($var+1)
bez powodzenia. Zmienna jest liczbą, choć wydaje się, że bash odczytuje ją jako ciąg znaków.
Wersja Bash 4.2.45 (1) -release (x86_64-pc-linux-gnu) na Ubuntu 13.10.
((++var))
lub((var=var+1))
lub((var+=1))
.var=0; ((var++))
zwraca kod błędu, podczas gdyvar=0; ((var++)); ((var++))
nie. Masz pomysł, dlaczego?help '(('
. Ostatnia linia mówi:Returns 1 if EXPRESSION evaluates to 0; returns 0 otherwise.
1
dlatego wskazówka @ gniourf_gniourf zawiera,((++var))
ale nie zawiera((var++))
.let var++
bez cytatów?Arytmetyka w bash używa
$((...))
składni.źródło
((...))
jest to klucz do korzystania z arytmetyki w bash. Nie zdawałem sobie sprawy, że patrząc tylko na przyjętą odpowiedź - pomyślałem, że istnieje dziwny zestaw zasad dotyczących kolejności operacji lub coś, co prowadzi do całego nawiasu w zaakceptowanej odpowiedzi.Analiza wydajności różnych opcji
Dzięki odpowiedzi Radu Rădeanu, która zapewnia następujące sposoby zwiększania zmiennej w bash:
Są też inne sposoby. Na przykład spójrz na inne odpowiedzi na to pytanie.
Posiadanie tak wielu opcji prowadzi do tych dwóch pytań:
Kod przyrostowego testu wydajności:
Wyniki:
Wniosek:
Wydaje się, że bash działa najszybciej,
i+=1
gdy$i
jest zadeklarowany jako liczba całkowita.let
instrukcje wydają się szczególnie wolne iexpr
są zdecydowanie najwolniejsze, ponieważ nie są wbudowane.źródło
Jest też to:
Zwróć uwagę na spacje, a także „ nie jest ”
Podczas gdy odpowiedzi Radu i komentarze są wyczerpujące i bardzo pomocne, są one specyficzne dla bash. Wiem, że konkretnie spytałeś o bash, ale pomyślałem, że się do niego odezwę, ponieważ znalazłem to pytanie, gdy szukałem tego samego, używając sh w busyboxie pod uCLinux. To przenośne poza bash.
źródło
i=$((i+1))
$(...)
jest dostępna w tej powłoce, polecam jej użycie zamiast tego.Jeśli zadeklarujesz
$var
jako liczbę całkowitą, to, co wypróbowałeś za pierwszym razem, faktycznie zadziała:Odniesienie: Rodzaje zmiennych, Przewodnik Bash dla początkujących
źródło
We wszystkich odpowiedziach brakuje jednej metody -
bc
bc
jest określony przez standard POSIX , więc powinien być obecny we wszystkich wersjach systemów zgodnych z Ubuntu i POSIX.<<<
Przekierowanie może być zmienione, abyecho "$VAR" | bc
do przenoszenia, ale skoro pytanie pyta obash
- to OK, aby po prostu używać<<<
.źródło
Kod zwrotny
1
problem występuje dla wszystkich wariantów (domyślnelet
,(())
itp). To często powoduje problemy, npset -o errexit
. W używanych skryptach . Oto, czego używam, aby zapobiec kodowi błędu1
wyrażeń matematycznych, które oceniają0
;źródło
To musi być najgorszy sposób na wykonanie tak prostego zadania, ale chyba po prostu chciałem to udokumentować dla zabawy (kompletne przeciwieństwo kodu golfa).
lub
Poważnie skorzystaj z jednego z innych znacznie lepszych wyborów tutaj.
źródło