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ândcontoreste 0 întoarce codul 1 (expresia valorează 0) și oprește scriptul rulat cuset -e. Folosește(( contor += 1 ))sau(( ++contor )).- Numere cu zero în față, ca
08sau09(de exemplu luna dintr-o dată): sunt citite în baza 8 și dau eroare. Scrie$(( 10#$luna )). echo 5 + 3saux=5+3nu 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.