Aritmetică în Bash: $(( )) și (( )) în Linux / Bash

Scripting Bash POSIX ($(( ))) / Bash ((( )), **)

Calcule cu numere întregi direct în shell: adunări, împărțiri, rest, puteri, contoare și comparații în (( )).

Sintaxă comandă
rezultat=$(( expresie ))
(( expresie ))
let "x = x + 1"

Ce face Aritmetică în Bash: $(( )) și (( ))

$(( expresie )) calculează o expresie cu numere întregi și pune rezultatul în locul ei. În interior, variabilele se pot scrie fără $, iar operatorii sunt cei din C: + - * / %, comparații, &&, || și, în Bash, ** pentru putere.

(( expresie )), fără $, este o comandă: modifică variabile ((( total += pret ))) și întoarce codul 0 dacă rezultatul este diferit de zero, altfel 1. De aceea se poate folosi direct în if și while: if (( nota >= 5 )).

Bash lucrează doar cu întregi: $(( 10 / 4 )) dă 2. Pentru zecimale folosește awk sau bc. Comenzile vechi let și expr fac același lucru, dar $(( )) este forma recomandată.

Opțiuni și argumente

Opțiune / Parametru Descriere
+ - * / % Adunare, scădere, înmulțire, împărțire întreagă, restul împărțirii.
** Ridicare la putere (Bash).
+= -= *= /= Modifică variabila: (( x += 5 )).
++ -- Incrementare și decrementare cu 1.
< <= > >= == != Comparații numerice în (( )): 1 pentru adevărat, 0 pentru fals.
cond ? a : b Operatorul ternar.
0x1F, 010, 2#101 Numere în baza 16, 8 și în orice bază de la 2 la 64.

Exemple

Exemplul 1: Calculul unei comenzi în lei

Împărțirea taie zecimalele, iar % dă restul.

PRET=45
CANTITATE=3
TOTAL=$(( PRET * CANTITATE ))
echo "Total: $TOTAL lei"
echo "Rest din 200 lei: $(( 200 - TOTAL )) lei"
echo "17 / 5 = $(( 17 / 5 )), rest $(( 17 % 5 ))"
echo "2 la puterea 10: $(( 2 ** 10 ))"

Rezultat

Total: 135 lei
Rest din 200 lei: 65 lei
17 / 5 = 3, rest 2
2 la puterea 10: 1024

Exemplul 2: Un contor în buclă cu (( ))

(( nota >= 5 )) este condiția, iar (( promovati += 1 )) modifică variabila.

promovati=0
for nota in 9 4 7 10 3; do
  if (( nota >= 5 )); then
    (( promovati += 1 ))
  fi
done
echo "Promovați: $promovati din 5"
echo "Status: $(( promovati >= 3 ? 1 : 0 ))"

Rezultat

Promovați: 3 din 5
Status: 1

Exemplul 3: Zecimale cu awk

Media notelor are zecimale, așa că o calculăm cu awk; Bash ar întoarce doar partea întreagă.

SUMA=$(( 9 + 7 + 10 + 8 ))
echo "Media în Bash: $(( SUMA / 4 ))"
awk -v s="$SUMA" 'BEGIN { printf "Media cu awk: %.2f\n", s / 4 }'

Rezultat

Media în Bash: 8
Media cu awk: 8.50

Greșeli frecvente

  • (( contor++ )) când contor este 0 întoarce codul 1 (expresia valorează 0) și oprește scriptul rulat cu set -e. Folosește (( contor += 1 )) sau (( ++contor )).
  • Numere cu zero în față, ca 08 sau 09 (de exemplu luna dintr-o dată): sunt citite în baza 8 și dau eroare. Scrie $(( 10#$luna )).
  • echo 5 + 3 sau x=5+3 nu calculează nimic: rezultatul este textul „5+3”. Calculul are loc doar în $(( )).

Comenzi înrudite

  • Variabile în Bash: Declararea, atribuirea, valorile implicite și expandarea corectă a variabilelor în Bash.
  • for: Iterează peste o listă de elemente, fișiere, argumente sau intervale de numere.
  • test, [ ] și [[ ]]: Verifică fișiere, numere și texte și întoarce codul 0 (adevărat) sau 1 (fals), folosit în if, while și cu && / ||.
  • awk: Limbaj de procesare a textului structurat pe coloane, ideal pentru rapoarte și extragere de date.