Nowe posty

xx Odpowiednie wykorzystanie rdzeni P i E procesora (0)
Wczoraj o 17:52:01
xx Samba DC/AD problem z DNS (0)
2024-07-25, 12:42:23
xx DNS i WWW na virtualbox (4)
2024-07-24, 10:30:38
xx Instalacja Manjaro Linux (11)
2024-07-13, 22:57:31
xx Linux Lite 6.6. Po uruchomieniu z DVD przeglądarka Chrome jest nieaktywna (12)
2024-07-10, 22:33:30
xx Laptop MSI CR500 - nie akceptuje linuksa (6)
2024-07-03, 05:30:18
xx Co to jest ? (3)
2024-07-02, 13:36:58
xx Nowa wersja libreoffice (1)
2024-06-30, 18:22:49
xx Dystrybucja - środowisko graficzna dla amigowca (MUI) (4)
2024-06-30, 12:14:25
xx Jaki kod błędu zwracać z kernela? (3)
2024-06-09, 12:29:22

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

Panas

  • Gość
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: 2771
  • 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: 2771
  • 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.

Panas

  • Gość
Odp: Szkielet z getops
« Odpowiedź #3 dnia: 2020-10-25, 15:06:20 »
Dzięki panowie, jak się da to mogę drążyć temat.