GNU/Linux >> Znalost Linux >  >> Linux

Jak vyhodnotit řetězce jako čísla v Bash

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.


Linux
  1. Jak bude Bash hodnotit následující kód?

  2. Jak porovnávat řetězce ve skriptování Bash Shell

  3. BASH:jak provádět aritmetiku na číslech v rouře

  1. Jak napsat smyčku v Bash

  2. Jak ladit Bash skript?

  3. Jak zjistit Bash>=4.0?

  1. Jak zřetězit řetězce v Bash

  2. Jak porovnat dva řetězce ve formátu verze oddělené tečkami v Bash?

  3. Jak zkontrolovat, zda smtp funguje z příkazového řádku (Linux)