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.

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.


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)