Portál AbcLinuxu, 2. listopadu 2025 09:58
#!/bin/bash echo "Třeba něco vypisuji."Pokud byste chtěl používat parametry typu
-o abc, podívejte se na man getopt.
#!/bin/bash
#parsování parametrů příkazové řádky
PARAMETRY=`getopt -q -o o:h:s:v: -- "$@"`
if [ $? != 0 ] ; then echo "Chybně zadané parametry" ; exit 1 ; fi
eval set -- "$PARAMETRY";
#připravení výchozích hodnot proměnných
DIR="comments"
HOD="hodnoceni.txt"
STUD="students.txt"
while true ; do
case "$1" in
-o) DIR="$2" ; shift 2;;
-h) HOD="$2" ; shift 2;;
-s) STUD="$2" ; shift 2;;
-v) if [ -n "$2" ] ; then VAR="$2" ; fi ; shift 2;;
--) shift ; break ;;
*) echo "Neznámý parametr" ; exit 2 ;;
esac
done
#nyní máte v proměnných $DIR, $HOD, $STUD, $VAR potřebné hodnoty (případně $VAR není definována)
echo $DIR
echo $HOD
echo $STUD
echo ${VAR:-"-- nezadáno --"}
Pomůžou vám k tomu man bash, man getopt, man test
Zde je žádaný kanón na vrabce 
volby="-o tl:"
getopt -Qq $volby -- "$@" || exit 1;
eval set -- `getopt -q $volby -- "$@"`;
...
while [ $# -gt 1 ]; do
case $1 in
-l) něco, když je -l param; shift 2;;
-t) parametr -t; shift 1;;
*) něco jíného; shift;;
esac
done
#!/bin/bash volby="-o t1:" getopt -Qq $volby -- "$@" || exit 1; eval set -- `getopt -q $volby -- "$@"`; while [ $# -gt 1 ]; do case $1 in -l) echo "tohle je parametr l"; shift 1;; -t) echo "parametr -t"; shift 1;; *) echo "něco jiného"; shift;; esac donetakhle jsem to přepsal, ale po spuštění a zadání například ./pokus.sh -l mi to nic nevypíše, ale třeba pro -t ano. nevíte kde je zrada?
volby="-o t1:"tam dej:
volby="-o tl:"(dvojtečka za "l" znamená, že ten přepínač bude chtít argument)
Zrada je také v prvním použití getopt s parametrem pro tichý výpis a také, že pokud selže, tak se celý skript ukončí (|| exit 1;).
#!/bin/bash
TEMP=`getopt -o o: -n 'ukazka2' -- "$@"`
if [ $? != 0 ] ; then echo "Koncim..." >&2 ; exit 1 ; fi
eval set -- "$TEMP"
while true ; do
case "$1" in
-o) echo "Volba o, argument \`$2'" ; shift 2 ;;
--) shift ; break ;;
*) echo "Internal error!" ; exit 1 ;;
esac
done
echo "Zbyvajici argumenty:"
for arg do echo '--> '"\`$arg'" ; done
V originalni verzi najdete i spoustu vysvetlujich komentaru. Spis bych doporucil vydat se timto smerem.
A kde je tam vidíte?
Spis bych doporucil vydat se timto smerem.
Naprosto souhlasím, ten můj původní kód jsem totiž pouze vykopíroval z jednoho skriptu a pouze doplnil komentáře - do skriptu se totiž vše předávalo pomocí voleb, takže jsem část za (případným) -- s klidem ignoroval.
getopt -Qq $volby -- "$@" || exit 1; eval set -- `getopt -q $volby -- "$@"`;
getopt -Qq $volby -- "$@" || exit 1;
Spustí getopt s danými volbami a otestuje jejich správnost (a v případě chyby nic nevypíše) - pokud nastane chyba (neznámý parametr atp.), tak je skript ukončen (spojka ||).
eval set -- `getopt -q $volby -- "$@"`;
Nastaví upravené parametry (tj. např. -ab rozdělí na 2 samostatné: -a a -b atd.) do proměnných $1, $2 ...
Tiskni
Sdílej:
ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.