Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: frees 27. 03. 2010, 09:14:22
-
Zdravim, mam takyto problem
Mam program s dvoma prepinacmi m(meno) a p(priezvisko) oba maju ako argument hladane meno a priezvisko. Chcel by som zistit ako urobit to, ze ked zadam -m aj -p, vypise mi zo zoznamu len polozky, ktore vyhovuju obom zadanym prepinacom, ale ked by som zadal napriklad len -m(Peter) tak mi to vypise vsetkych ludi ktori maju v mene Peter
-
Trochu jsem si hral, asi to nebude uplne "clean solution" ale funguje to:
#!/bin/sh
array=("Tomas Novak" "Jan Novak" "Tomas Dobrak" "Jan Dvorak")
if [ "" == "$1" ]; then
echo
echo Usage: test.sh -m jmeno -p prijmeni
fi
case "$1" in
-m)
echo
echo Hledam jmeno:
echo
for ((i=0;i<${#array[*]};i++)); do
echo ${array[i]} | grep $2
done
;;
esac
case "$3" in
-p)
echo
echo Hledam jmeno a prijmeni:
echo
for ((i=0;i<${#array[*]};i++)); do
echo ${array[i]} | grep $2 | grep $4
done
;;
esac
exit 0
NN
-
A neosetrena varianta s getopts:
#!/bin/sh
array=("Tomas Novak" "Jan Novak" "Tomas Dobrak" "Jan Dvorak")
while getopts "m:p:" o
do
case "$o" in
m)
echo
echo Hledam jmeno:
M=$OPTARG
for ((i=0;i<${#array[*]};i++)); do
echo ${array[i]} | grep $OPTARG
done
;;
p)
echo
echo Hledam jmeno a prijmeni:
for ((i=0;i<${#array[*]};i++)); do
echo ${array[i]} | grep $M | grep $OPTARG
done
;;
*) echo usage: test.sh -m jmeno -p prijmeni
;;
esac
done
shift $(($OPTIND - 1))
exit 0
NN
-
#!/bin/bash
while getopts "m:p:" Option; do
case $Option in
m ) jmeno="$OPTARG";;
p ) prijmeni="$OPTARG";;
* ) echo "Neplatný vstup";;
esac
done
shift $(($OPTIND - 1))
echo "$jmeno $prijmeni" $1 $2
-
Ještě s řešením včetně jednoduché databáze:
#!/bin/bash
jmeno=""
prijmeni=""
while getopts "m:p:" Option; do
case $Option in
m ) jmeno="$OPTARG";;
p ) prijmeni="$OPTARG";;
* ) echo "Neplatný vstup";;
esac
done
shift $(($OPTIND - 1))
grep "$jmeno $prijmeni" - << EOF
Tomas Novak
Jan Novak
Tomas Dobrak
Jan Dvorak
EOF
-
NN: asi to nebude uplne "clean solution" ale funguje to
nebude to fungovat vo viacerych situaciach:
test.sh -p "priezvisko"
test.sh -p "priezvisko" -m "meno"
Na spracovanie vstupu sa da pouzit napr.:
meno=""
priez=""
while [ $# -gt 0 ]; do
case "$1" in
"-m") meno="$2"; shift;;
"-p") priez="$2"; shift;;
*) echo "Chybny prepinac!!!"; exit 1;;
esac
shift
done
echo "Meno: $meno";
echo "Priezvisko: $priez";
Spracovanie zoznamu uz treba riesit individualne (podla toho ako je vytvoreny). Spravne by sa malo meno hladat iba v menach, ...
Nezabudnite vo vsetkych vyskytoch davat premenne (meno, priez) do uvodzoviek - aby to fungovalo aj ked uzivatel zada meno/priezvisko s medzerou.
Druha moznost je riesit cez getopts - vid medzitym poslane riesenie od Kita
meno=""
priez=""
while getopts "m:p:" opt
do
case "$opt" in
"m") meno="$OPTARG";;
"p") priez="$OPTARG";;
*) echo "Chybny prepinac!!!"; exit 1;;
esac
done
shift $((OPTIND-1))
echo "Meno: $meno";
echo "Priezvisko: $priez";
echo "Zvysne parametre (nie prepinace): $@"
Tato moznost dovoli zapisat prepinac aj spolu s parametrom, napr. -mTomas a kontroluje ci nie je zadany neznamy prepinac.