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.
example@unixlinux.online:~$ sum=3+6
example@unixlinux.online:~$ 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:
example@unixlinux.online:~$ sum=$((3+6))
example@unixlinux.online:~$ 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ů.
example@unixlinux.online:~$ a=11
example@unixlinux.online:~$ b=3 Přidělené číslo můžete zkontrolovat:
example@unixlinux.online:~$ echo $a
11
example@unixlinux.online:~$ echo $b
3
Zkusme nyní sečíst obě čísla a uložit hodnotu do třetí proměnné c :
example@unixlinux.online:~$ c=$a+$b
example@unixlinux.online:~$ 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í:
example@unixlinux.online:~$ c=$(($a+$b))
example@unixlinux.online:~$ 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.
example@unixlinux.online:~$ c=$((5))
Výše uvedené je ekvivalentní:
example@unixlinux.online:~$ c=5
Použijme třetí proměnnou d pro jinou operaci:
example@unixlinux.online:~$ 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:
example@unixlinux.online:~$ e=$(($a+$b*$c-$d))
example@unixlinux.online:~$ 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.
example@unixlinux.online:~$ sum=$((3+hello))
example@unixlinux.online:~$ 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.
example@unixlinux.online:~$ 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.