Spracovanie prepínačov pomocou getopts v Bash

frees

Spracovanie prepínačov pomocou getopts v Bash
« kdy: 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
« Poslední změna: 27. 03. 2010, 09:55:15 od Petr Krčmář »


NN

Re: Spracovanie prepinacov pomocou getopts v Bash
« Odpověď #1 kdy: 27. 03. 2010, 09:55:11 »
Trochu jsem si hral, asi to nebude uplne "clean solution" ale funguje to:

Kód: [Vybrat]
#!/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

NN

Re: Spracovanie prepínačov pomocou getopts v Bash
« Odpověď #2 kdy: 27. 03. 2010, 10:25:49 »
A neosetrena varianta s getopts:

Kód: [Vybrat]
#!/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

Kit

Re: Spracovanie prepínačov pomocou getopts v Bash
« Odpověď #3 kdy: 27. 03. 2010, 10:30:27 »
Kód: [Vybrat]
#!/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

Kit

Re: Spracovanie prepínačov pomocou getopts v Bash
« Odpověď #4 kdy: 27. 03. 2010, 10:46:33 »
Ještě s řešením včetně jednoduché databáze:

Kód: [Vybrat]
#!/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


deadmail

Re: Spracovanie prepínačov pomocou getopts v Bash
« Odpověď #5 kdy: 27. 03. 2010, 10:48:05 »
Citace
NN: asi to nebude uplne "clean solution" ale funguje to

nebude to fungovat vo viacerych situaciach:
Kód: [Vybrat]
test.sh -p "priezvisko"
test.sh -p "priezvisko" -m "meno"

Na spracovanie vstupu sa da pouzit napr.:
Kód: [Vybrat]
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
Kód: [Vybrat]
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.