Stejně jako v Linuxu je vše soubor, v bash je vše řetězec.
Ano! Technicky v Bash nejsou žádné datové typy. Proměnné Bash jsou v podstatě pouze znakové řetězce.
A to vytváří problém, když se pokoušíte provádět aritmetické operace v bash. Čísla, která se snažíte přidat, vám dávají podivné výsledky.
[email protected]:~$ sum=3+6
[email protected]:~$ echo $sum
3+6
Chcete-li převést řetězce na celá čísla v bash, zabalte je do $((X)). Takhle:
$((string))
Pokud má řetězec identifikovatelné číslo, bude s ním nakládáno jako s číslem. Příklad, který jsem ukázal výše, lze opravit takto:
[email protected]:~$ sum=$((3+6))
[email protected]:~$ echo $sum
9
Cokoli, co uděláte uvnitř $((...)), se považuje za aritmetickou operaci. Podívejme se na převod řetězců na čísla trochu podrobněji, abyste mohli používat aritmetické výpočty v bash.
Převod řetězcových proměnných na čísla
Pojďme deklarovat nějaká "čísla", což jsou v podstatě řetězce znaků.
[email protected]:~$ a=11
[email protected]:~$ b=3
Přidělené číslo můžete zkontrolovat:
[email protected]:~$ echo $a
11
[email protected]:~$ echo $b
3
Zkusme nyní sečíst obě čísla a uložit hodnotu do třetí proměnné c
:
[email protected]:~$ c=$a+$b
[email protected]:~$ echo $c
11+3
Jak můžete vidět na výstupu výše, c je také považováno za řetězec.
Aby bylo sčítání úspěšné, musíte jej „převést“ pomocí aritmetického rozšíření:
[email protected]:~$ c=$(($a+$b))
[email protected]:~$ echo $c
14
Pamatujte, že c
je ve skutečnosti stále řetězec, dokud implicitně znovu nepoužijete stejné aritmetické rozšíření pro další operaci, o které budu diskutovat za chvíli.
[email protected]:~$ c=$((5))
Výše uvedené je ekvivalentní:
[email protected]:~$ c=5
Použijme třetí proměnnou d
pro jinou operaci:
[email protected]:~$ d=10
Všechny tyto implicitní deklarace jsou stále řetězce. Je to stejné, jako jsem definoval a
a b
dříve.
Nyní k druhé operaci:
[email protected]:~$ e=$(($a+$b*$c-$d))
[email protected]:~$ echo $e
16
Ve výše uvedeném výrazu se nejprve vypočítá součin b a c a nakonec následuje sčítání a odčítání.
Jak jsem již zmínil, cokoli, co uděláte mezi $((...)) se považuje za aritmetickou operaci.
Celý tento převod funguje pro celá čísla. Nebude to fungovat s plovoucí desetinnou čárkou, tj. čísly s desetinnými čárkami.Zkuste smíchat skutečné řetězce a čísla
Míchání řetězců a celých čísel je stále bezpečnější než míchání koksu a máty. Výsledkem je však podivný výsledek.
[email protected]:~$ sum=$((3+hello))
[email protected]:~$ echo $sum
3
Bude to fungovat pouze tehdy, když tam budou čísla (jako řetězec). Pokud je to čistý znakový řetězec, nebude magicky převeden na nějaká čísla. Místo toho je ignorován, jak můžete vidět v příkladu výše.
Alternativní metoda:použijte výraz
Můžete také použít expr
nástroj k provedení hodnocení, ale uvědomte si, že se nejedná o „nativní“ postup Bash, protože musíte mít coreutils
nainstalován (ve výchozím nastavení na Ubuntu) jako samostatný balíček.
[email protected]:~$ expr $a + $b \* $c - $d
16
Doufám, že vám tento krátký návod pomohl při vyhodnocování bashových strun jako čísel. Máte-li dotazy nebo návrhy, neváhejte zanechat komentář níže.