Kdykoliv shell narazí na výskyt $(( ... )), nahradí text uvnitř závrek jeho aritmetickým vyčíslením. Uvnitř se smí používat proměnné, celočíselné konstanty, aritmetické operátory +-*/%, bitové operátory &|^, >>, <<, logické operátory && a ||, ternární operátor expr?expr:expr, operátory porovnání a přiřazení a libovolné množství mezer.
Uvnitř $(( ... )) nemusíme (ale můžeme) používat $ před jménem proměnné, protože jediné řetězce znaků, které se smí uvnitř vyskytnout jsou právě jména proměnných. Aritmetická expanze umí pracovat pouze s celými čísly. I dělení je pouze celočíselné.
i=$((i+1)) ≈ i=$(($i+1)) x=$((2*3+1-i)) max=$(( a>b ? a : b ))
Potřebujeme-li pracovat s desetinnými čísly, mocnit je nebo dělat další operace, které aritmetická expanze nezvládá, můžeme se obrátit na program bc. Jedná se o kalkulátor s libovolnou přesností. Pokud spustíte bc bez parametrů, přepne se do interaktivního módu a očekává vstup z klávesnice. Můžeme mu ale také poslat výraz na standardní vstup a výsledek si přečíst ze standardního výstupu. Jediné co bc oproti aritmetické expanzi postrádá jsou bitové operátory.
Standardně počítá bc s přesností na 0 desetinných míst. Použití přepínače -l ji zvýší na 20. Pokud chceme počítat na jiný počet desetinných míst, můžeme to bc dát na vědomí nastavením scale:
echo "2*3-5+$y" | bc printf "%s\n" 'scale = 50; 104348/33215' | bc