Portál AbcLinuxu, 21. května 2025 07:50

Bash, moje knihovnička funkcí pro práci s čísly

7.1.2009 03:34 | Přečteno: 1596× | Bash | Výběrový blog

Učím se psát jednodušší skriptíky v Bashi. Chystám se napsat v Bashi "prográmek". Tak jsem vytvořil takovou knihovničku funkcí pro práci s čísly. A rád bych se s vámi o ni podělil. Doufám, že vám k něčemu bude, i když třeba jenom pro pobavení. :-)

#!/bin/bash
#********************************************************************************************
## numbers.sh
## autor: Václav Radoměřský
## leden 2009
## licence: GNU GPL verze 2 nebo 3 nebo novější, nebo modifikovaná ("trojbodová") BSD licence
#********************************************************************************************
# Je to vlastně jakási "knihovna" funkcí, kterou můžete do svého shellového skriptu
# vložit příkazem source (.), příklad:
# source /cesta/numbers.sh
# nebo: . /cesta/numbers.sh
# Otestováno (je funkční) v Bash verze 3.2.39(1). Pokud nemáte extrémně starou verzi Bashe,
# tak by to mělo jet.
success=0
# hodnota, kterou budou funkce vracet v případě "úspěchu" (pravdy)
error=-1
# To je hodnota, kterou navrátí vybrané funkce v případě chyby
rrandom_number=-1
# rrandom_number je proměnná, ve které bude návratová hodnota funkce random_number
max_random=32767
# max_random udává největší pseudonáhodné číslo vrácené Bashem
min_random=0
# nejmenší pseudonáhodné číslo vracené Bashem
is_zero()
{
# Vrátí $succes, jestliže parametr číslo jedna je nula, jinak vrátí $error.
# Testujeme, zda byl funkci předán aspoň jeden argument
if [ $# -lt 1 ]
then
 return $error
fi
# Testuje, zda dané číslo je rovno 0.
# napravo od =~ je regulární výraz
if [[ "${1}" =~ 0 ]]
then
 return $success
else
 return $error
fi
}
is_positive_number()
{
# Otestuje, zda $1 je kladné číslo. Vrátí hodnotu proměnné success, pokud argument je kladné číslo,
# jinak vrátí hodntou proměnné "error" (tedy ${error}).
# Testujeme, zda funkci byl předán aspoň jeden parametr ("argument")
if [ $# -lt 1 ]
then
 return $error
fi
#
# Testujeme, zda první parametr je kladné číslo
# napravo od =~ je regulární výraz
if [[ "${1}" =~ ^[+]?[1-9]+[0-9]*$ ]]
then
 return $success
else
 return $error
fi
}
is_negative_number()
{
# Vrátí $succes, jestliže parametr číslo jedna je záporné číslo, jinak vrátí $error.
if [ $# -lt 1 ]
then
 return $error
fi
# Napravo od =~ je regulární výraz.
if [[ "${1}" =~ ^-[1-9]+[0-9]*$ ]]
then
 return $success
else
 return $error
fi
}
is_nonnegative_number()
{
# Vrátí $success, pokud argument je nezáporné číslo, jinak vrátí $error.
if is_zero $1 || is_positive_number $1
then
 return $success
else
 return $error
fi
}
is_nonpositive_number()
{
# Vrátí $success v případě nekladného arguemntu (parametru), jinak vrátí $error.
if [ $# -lt 1 ]
then
 return $error
fi
if is_zero $1 || is_negative_number $1
then
 return $success
else
 return $error
fi
}
is_number()
{
# Vrátí $succes, jestliže první parametr je číslo, jinak vrátí $error.
if [ $# -lt 1 ]
then
 return $error
fi
if is_nonnegative_number $1 || is_nonpositive_number $1
then
 return $success
else
 return $error
fi
}
compare_numbers()
{
# Funkce porovná dvě čísla -- $1 a $2.
# Vrátí $success, pokud je druhý parametr funkce větší než první.
# Jinak vrátí hodnotu $error.
#
# Otestujeme, zda jsme dostali aspoň dva parametry (argumenty) a zda to jsou čísla.
if [ $# -ge 2 ] && is_number $1 && is_number $2
then
 if [ $2 -gt $1 ]
 then
  return $success
 else
  return $error
 fi
else
 return $error
fi
}

random_number()
{
# Vrátí pseudonáhodné číslo z intervalu <$1;$2>.
# $1 musí být menší než $2.
# Tato funkce využívá "proměnné" RANDOM.
# Otestujeme, zda jsme dostali aspoň dva parametry ("argumenty"). V případě že ne, skončím s chybou.
if [ $# -lt 2 ]
then
 return $error
fi
# Funkce compare_numbers nám zkontroluje, zda se jedná o čísla a zda je $2 > $1.
if compare_numbers $1 $2
then
 rrandom_number=$RANDOM
# "Proměnná" RANDOM generuje pseudonáhodá čísla, viz man bash.
 delka_intervalu=$(($2-$1))
 max_delka_intervalu=$(($max_random-$min_random))
 procentni_podil=$((( $rrandom_number-$min_random )*100/$max_delka_intervalu))
 rrandom_number=$(($1+$procentni_podil*$delka_intervalu/100))
else
 return $error
fi
}

       

Hodnocení: 100 %

        špatnédobré        

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

Komentáře

Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře. , Tisk

Vložit další komentář

7.1.2009 08:07 Jan Kurik | blog: Hemis
Rozbalit Rozbalit vše Re: Bash, moje knihovnička funkcí pro práci s čísly
Odpovědět | Sbalit | Link | Blokovat | Admin

Není to zbytečně komplikované ? Jakou výhodu má třeba použití funkce is_nonnegative_number() místo klasického [[ $X -ge 0 ]] ? Taky mi příjde trošku těžkopádné používat regulární výrazy na to abych zjistil, zda je proměnná rovna nule.

Ale jako tréningový script to není špatné.

7.1.2009 08:57 pht | skóre: 48 | blog: pht
Rozbalit Rozbalit vše Re: Bash, moje knihovnička funkcí pro práci s čísly
imho proto, ze jde o to aby to bylo cislo a ne "blerf"
In Ada the typical infinite loop would normally be terminated by detonation.
7.1.2009 20:56 Jirka P
Rozbalit Rozbalit vše Re: Bash, moje knihovnička funkcí pro práci s čísly
Na já nevim...

\u@\h:\w$ a=blarf
\u@\h:\w$ [ $a -eq 0 ] && echo 1;
[: 2: Illegal number: blarf
\u@\h:\w$ [ $a -eq 0 ] || echo 0;
[: 3: Illegal number: blarf
0
7.1.2009 21:06 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: Bash, moje knihovnička funkcí pro práci s čísly
Zkuste to s těmi doporučovanými dvojitými.
7.1.2009 23:21 Jirka P
Rozbalit Rozbalit vše Re: Bash, moje knihovnička funkcí pro práci s čísly
A proč bych měl? Je nějaký jiný důvod, než abych zjistil, že v tomto konkrétním případě se od jednoduchých liší?
8.1.2009 06:40 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: Bash, moje knihovnička funkcí pro práci s čísly
Protože Jan Kurik, který tuto větev začal, tam měl dvojité, takže vaše odpověď pht je o něčem jiném, než o čem on psal.
7.1.2009 09:29 Begleiter | skóre: 47 | blog: muj_blog | Doma
Rozbalit Rozbalit vše Re: Bash, moje knihovnička funkcí pro práci s čísly

Ale jako tréningový script to není špatné.

Díky. :-)

Salutis avatar 7.1.2009 10:23 Salutis | skóre: 7 | blog: Salutis
Rozbalit Rozbalit vše Re: Bash, moje knihovnička funkcí pro práci s čísly
Odpovědět | Sbalit | Link | Blokovat | Admin

Načo je dobré používať blok na jeden príkaz?

if [ $# -lt 1 ]
then
return $error
fi

.. namiesto ..

[ $# -lt 1 ] && return $error

Vidieť to v skriptoch dosť často, tak neviem, asi to príde niekomu prehľadnejšie.

Najväčší dar je vedieť posúdiť hodnotu vecí.
Salutis avatar 7.1.2009 10:33 Salutis | skóre: 7 | blog: Salutis
Rozbalit Rozbalit vše Re: Bash, moje knihovnička funkcí pro práci s čísly
Funkcia is_zero je extrémny úlet. Ináč celkom fajn!
Najväčší dar je vedieť posúdiť hodnotu vecí.
7.1.2009 12:29 Michal Kubeček | skóre: 72 | Luštěnice
Rozbalit Rozbalit vše Re: Bash, moje knihovnička funkcí pro práci s čísly
Kdyby u toho prvního bylo then na stejném řádku s if a tělo bylo odsazené, považoval bych to za přehlednější.
7.1.2009 10:27 Dejv | skóre: 37 | blog: Jak ten blog nazvat ... ? | Ostrava
Rozbalit Rozbalit vše Re: Bash, moje knihovnička funkcí pro práci s čísly
Odpovědět | Sbalit | Link | Blokovat | Admin

Zdravim.

Dobry napad :-) ale trochu se mi nelibi ta kontrola poctu argumentu. Teda ona ta kontrola samotna je v poradku, ale i kdyz funkci nepredate pozadovany pocet argumentu, tak pokracujete v behu funkce. Pouze funkce compare_numbers se takto nechova, ale ja bych i tam tu kontrolu rozdelil na dva ify - v prvnim pocet argumentu a az v pripade spravneho poctu kontrola, zda to jsou cisla.

No a pokracovat muzete rozsirenim na desetinna cisla a na osmickova a hexa-cisla :-).

Dejv
Pevně věřím, že zkušenější uživatelé mě s mými nápady usměrní a pošlou tam, kam tyto nápady patří...
7.1.2009 11:00 YYY | skóre: 29 | blog: martinek
Rozbalit Rozbalit vše Re: Bash, moje knihovnička funkcí pro práci s čísly
Odpovědět | Sbalit | Link | Blokovat | Admin
Ja si vystavim s awk a brainfuckem. Ale jinak celkem pekne(ale co to is_zero?).
Václav 7.1.2009 11:45 Václav "Darm" Novák | skóre: 26 | blog: Darmovy_kecy | Bechyně / Praha
Rozbalit Rozbalit vše Re: Bash, moje knihovnička funkcí pro práci s čísly
No počkej, přesně tahle funkce mi v bashi chyběla :D Ne, jinak je to opravdu pěkné.
Cross my heart and hope to fly, stick a cupcake in my eye!

Založit nové vláknoNahoru

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.