Portál AbcLinuxu, 10. května 2025 00:10

Dotaz: Parametry

21.3.2010 15:11 Rogue | skóre: 4
Parametry
Přečteno: 400×
Odpovědět | Admin

Dobrý den, jelikož Bash není moje silná stránka obracím se na Vás o pomoc. Mám script, ze kterého získávám parametry pomocí getopts(). A vůbec si nevím rady jak oštřit to, že když uživatel zadná špatný parametr či jakýkoli nesmysl, aby mu script vrátil chybové hlášeí. Prosím o pomoc, přikádám můj "scriptík".

while getopts "a:b:c:d:e:" PARAMETR;

do

case $PARAMETR in

e) echo "ahoj" ;;

w) echo "cau" ;;

\?) echo "hlaseni"; exit 1 ;;

*) echo "hlaseni"; exit 1 ;;

esac

done


Řešení dotazu:


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

Odpovědi

21.3.2010 17:32 zulu
Rozbalit Rozbalit vše Re: Parametry
Odpovědět | | Sbalit | Link | Blokovat | Admin
Jestli myslíš parametry jednotlivých voleb, tak ty se ukládají do $OPTARG a můžeš si je testovat, jak potřebuješ.

Jestli myslíš parametry, které getopts vůbec nezpracuje, tak v $OPTIND je index dalšího parametru ke zpracování (resp. posledního nezpracovaného) a můžeš ho (za tím while) porovnat s celkovým počtem parametrů.
[ $OPTIND -le $# ] && echo "zasek na parametru $OPTIND - ${!OPTIND}"
22.3.2010 19:47 Rogue | skóre: 4
Rozbalit Rozbalit vše Re: Parametry
Pořeboval bych ukázat jak ošetřit dva parametry ze scriptu uvedeného výše takovým způsobem, aby nemohli být zadány současně například parametry -a -b, v případě že by je uživatel zadal obdržel by chybové hlášení. Prostě a stručně nemůže být zadáno -a i -b současně, ale která koliv kombinace jiných parametrů být zadána může. Moc díky za vaši odpověď.
22.3.2010 20:03 l4m4
Rozbalit Rozbalit vše Re: Parametry
Aplikační logika se holt musí napsat, to getopt sám neudělá.
seen_a=
seen_b=

...
while getopts...
...
a) seen_a=yes; ...;;
b) seen_b=yes; ...;;
...
esac
...

if test -n "$seen_a" -a -n "$seen_b"; then
  echo "At most one of -a and -b can be given" 1>&2
  exit 1
fi
22.3.2010 20:53 Rogue | skóre: 4
Rozbalit Rozbalit vše Re: Parametry
Moc diky
22.3.2010 21:06 Rogue | skóre: 4
Rozbalit Rozbalit vše Re: Parametry
Narazil jsem na další problém, potřebuji si vypsat poslední prametr programu, vím že proměnná $# nese v sobě počet zadaných paramaetrů.
22.3.2010 21:35 cronin | skóre: 49
Rozbalit Rozbalit vše Re: Parametry
echo "${${#}}"
Fuky avatar 22.3.2010 21:47 Fuky | skóre: 52 | blog: 4u
Rozbalit Rozbalit vše Re: Parametry
eval "last=\${$#}"
echo $last
Fuky avatar 22.3.2010 22:02 Fuky | skóre: 52 | blog: 4u
Rozbalit Rozbalit vše Re: Parametry

Případně:

echo ${!#}

nebo:

args=("$@")
echo "${args[$(($#-1))]}"
22.3.2010 22:02 Rogue | skóre: 4
Rozbalit Rozbalit vše Re: Parametry
Jsi si jistý že je to takto ?
Fuky avatar 22.3.2010 21:41 Fuky | skóre: 52 | blog: 4u
Rozbalit Rozbalit vše Re: Parametry
shift $(($#-1))
echo $1
22.3.2010 22:05 Rogue | skóre: 4
Rozbalit Rozbalit vše Re: Parametry
Díky moc, dokonalost tahle pomoc fakt dík.
23.3.2010 12:12 Rogue | skóre: 4
Rozbalit Rozbalit vše Re: Parametry
Mohl by jsi to tochu objsanit, je to přesně to co jesem chtěl, ale nedokážu pochopit ten princip. Díky
Fuky avatar 23.3.2010 12:45 Fuky | skóre: 52 | blog: 4u
Rozbalit Rozbalit vše Re: Parametry
Co konkrétně potřebuješ objasnit, něco z příspěvku od l4m4?
23.3.2010 13:34 Rogue | skóre: 4
Rozbalit Rozbalit vše Re: Parametry
Nechápu to vykonání té podmínky vzhledem k tomu že je na konci. Mám na to asi jinný pohled proto prosím o stručné vysvětlení. Díky
Fuky avatar 23.3.2010 14:09 Fuky | skóre: 52 | blog: 4u
Rozbalit Rozbalit vše Re: Parametry

Problém je v tomto případě rozdělen na dvě nezávislé části:

  1. v cyklu se načtou všechny argumenty příkazové řádky do proměných
  2. provede se kontrola kolize argumentů

To může značně zpřehlednit kód. Důležité je, že v cyklu pro zpracování argumentů jen nastavuješ proměné, ale nevykonáváš zatím žádnou akci, právě proto si můžeš dovolit test kolize až za tímto cyklem.

Ale lze to řešit i jinak, záleží na konkrétním návrhu logiky argumentů příkazové řádky. Např. pokud nechci společně použít argumenty -a, -b je zbytečné ukládat nastavení těchto argumentů do dvou proměných, ale stačí jedna proměná, která implicitně neobsahuje nic a před přiřazením hodnoty a nebo b se testuje zda-li je prázdná a teprve poté se provede přiřazení. Pokud prázdná není, tak může uživatel okamžitě dostat chybové hlášení, že nesmí používat společně argumenty -a, -b a program se může ukončit aniž by se pokračovalo v dalším zpracovávání argumentů.

BTW: Pokud píšeš něco rozsáhlejšího, tak doporučuji zvážit použití Pythonu. Psát větší projekty v Bashi je cesta do pekel. A ani na ty menší se nevyplatí, pokud pro to nemáš nějaký opravdu pádný důvod.

23.3.2010 16:57 Rogue | skóre: 4
Rozbalit Rozbalit vše Re: Parametry
Moc díky už to chápu :). Jinak v tom Pythonu s tebou souhlasím ve všech směrech. Bohužel pro BASH mám důvod proto tolik otázek, ale každopádně díky za odpovědi.
23.3.2010 14:41 duigha
Rozbalit Rozbalit vše Re: Parametry
Odpovědět | | Sbalit | Link | Blokovat | Admin
Na FITu začaly projekty? :)

Založit nové vláknoNahoru

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

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