Portál AbcLinuxu, 21. května 2025 07:50
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 }
Tiskni
Sdílej:
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é.
\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
Ale jako tréningový script to není špatné.
Díky.
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.
then
na stejném řádku s if
a tělo bylo odsazené, považoval bych to za přehlednější.
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 if
y - 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 .
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.