Nowe posty

Autor Wątek: Szkielet z getops  (Przeczytany 333 razy)

Offline Panas

  • Users
  • Stały bywalec
  • ***
  • Wiadomości: 181
    • Zobacz profil
Szkielet z getops
« dnia: 2020-10-24, 01:13:31 »
Chcę zrobić coś takiego że przy odpaleniu skrypu muszę podać dwie opcje np -c -a
Pierwszy  argument (c||a) odpowiednie narzędzie i dla nich (a || b || c || d ) czyli co ma się wykonać  np a odczytuje, b zapisuje, d robi backup d przywraca backup.
Pierwsza cześć kodu się wykona (przy za komentowaniu drugiej cześci) ale przy a) wywala błąd.
getopts nie można zagnieżdżać? jak powinien wyglądać taki szkielet poprawnie?



while getopts ":ca" opt
do
case "${opt}" in
c)
            while getopts ":abcd" opt2
            do
                case "${opt2}" in
                    e)
                    echo "ok -a"
                    ;;
                    d)
                    echo "ok -b"
                    ;;
                    k)
                    echo "ok -c"
                    ;;
                    j)
                    echo  "ok -d"
                    ;;
                    *)
                    echo "Invalid option: -$OPTARG" >&2
                    exit 1
                    ;;
                esac
            done   


        a)
            while getopts ":abcd" opt2
            do
                case "${opt2}" in
                    e)
                    echo "ok -a"
                    ;;
                    d)
                    echo "ok -b"
                    ;;
                    k)
                    echo "ok -c"
                    ;;
                    j)
                    echo  "ok -d"
                    ;;
                    *)
                    echo "Invalid option: -$OPTARG" >&2
                    exit 1
                    ;;
                esac
            done 
       

       
     
esac
done

Offline 1709

  • Users
  • Guru
  • *****
  • Wiadomości: 2404
  • 1709
    • Zobacz profil
Odp: Szkielet z getops
« Odpowiedź #1 dnia: 2020-10-25, 10:27:13 »
Alternatywa
#!/bin/bash

HELP() {
echo " -c -k     Odczytuje k "
echo " -c -l     Odczytuje l "
echo " -c -m     Odczytuje m "
echo " -c -n     Odczytuje n "
echo " -a -r     Zapisuje r  "
echo " -a -s     Zapisuje s  "
echo " -a -t     Zapisuje t  "
echo " -a -u     Zapisuje u  "
}

OPCJA_C() {
    case "$1" in
        -k|-K) echo "Odczytuje k" ;;
        -l|-L) echo "Odczytuje l" ;;
        -m|-M) echo "Odczytuje m" ;;
        -n|-N) echo "Odczytuje n" ;;
        *) echo "Zly drugi parametr  $1" ; echo "Jezeli potrzebujesz pomocy uzyj komendy: $0 --help" ;;
    esac
}

OPCJA_A() {
    case "$1" in
        -r|-R) echo "Zapisuje r" ;;
        -s|-S) echo "Zapisuje s" ;;
        -t|-T) echo "Zapisuje t" ;;
        -u|-U) echo "Zapisuje u" ;;
        *) echo "Zly drugi parametr  $1"  ; echo "Jezeli potrzebujesz pomocy uzyj komendy: $0 --help" ;;
    esac
}


case "$1" in
    -c|-C) OPCJA_C "$2" ;;
    -a|-A) OPCJA_A "$2" ;;
    -h|--help)     HELP ;;
    *) echo "Zly pierwszy parametr $1" ; echo "Jezeli potrzebujesz pomocy uzyj komendy: $0 --help" ;;
esac

Edycja
Zmienilem slowa argument na slowa parametr.
« Ostatnia zmiana: 2020-10-25, 12:03:23 wysłana przez 1709 »
PS: Brak polskiej czcionki, nie jest to brak lenistwa, a jej brak w systemie i brak czasu na reczne poprawki.

Offline 1709

  • Users
  • Guru
  • *****
  • Wiadomości: 2404
  • 1709
    • Zobacz profil
Odp: Szkielet z getops
« Odpowiedź #2 dnia: 2020-10-25, 13:07:17 »
Panas W swoim przykladzie dałeś
                case "${opt2}" in 
                    e)
                    echo "ok -a"
Pomyliłeś się, dałeś "e" zamiast "a"

Kiedy tworzyles  na poczatku pierwszy " case "
while getopts ":ca" opt
do
case "${opt}" in
c)
                a)
esac
done

Zapomniales dac sredniki  " ;; " na koncu kazdej opcji.
PS: Brak polskiej czcionki, nie jest to brak lenistwa, a jej brak w systemie i brak czasu na reczne poprawki.

Offline Panas

  • Users
  • Stały bywalec
  • ***
  • Wiadomości: 181
    • Zobacz profil
Odp: Szkielet z getops
« Odpowiedź #3 dnia: 2020-10-25, 15:06:20 »
Dzięki panowie, jak się da to mogę drążyć temat.