getopts kérdés

Kísérletezgetek ezzel a lehetőséggel. De még nem értem eléggé.

while getopts "adsh" option; do
    case "${option}" in
        a) addDate ;;
        d) delDate ;;
        s) showDate ;;        
        h) usage ;;
        \?) echo "Súgó: program -h "        
            exit;;
    esac
done 

Viszont ezzel így nem működik az az opció, hogyha kapcsoló nélkül indítom, akkor bejöjjön a súgó. Az is érdekelne hogy megoldható-e az hogy pl. a) addDate helyett pl. ad) addDate legyen. Ez persze itt most csak egy példa, de szükségem volna ilyesmire máshol, ahol vegyesen vannak a kapcsolók, -o vagy -od, -v ,-vs mert másképpen nem tudtam megoldani. Persze az most működik sima while shift-tel. De kérdés kiválthatom-e, érdemes-e ere a getopts-ra. Mindettől függetlenül a paraméter nélküli indításra előjöhetne a súgó.

Hozzászólások

> hogyha kapcsoló nélkül indítom, akkor bejöjjön a súgó

Egyik megoldás: $# mutatja a paraméterek számát, de ebben minden benne van, ezt nem érdekli, hogy az pl. kapcsoló-e, vagy argumentum.

Ha szeretnéd észlelni, hogy nincs opció, noha van egyéb maradék paraméter, akkor pl. ilyesmit lehet:

https://serverfault.com/questions/95077/how-can-i-get-remaining-args-af…

A másik kérdésed nekem nem pontos:

a jelen megoldás pl. "-asd"-re meghívja az addDate, showDate, delDate függvényeket (szkripteket), ha ez kell, ez pipa.

Ha azt szeretnéd, hogy több különböző paraméterre ugyanaz a hívás történjen, a case érti ezt:

  a|d) addDate

Ekkor mind a -a, mind a -d paraméterre az addDate hívódik.  "-ad"-re pedig kétszer.

Szerkesztve: 2022. 01. 01., szo – 15:07

"pl. a) addDate helyett pl. ad) addDate legyen" - Ebben a felállásban nem, mert a -ad az "-a -d" -nek felel meg. Ha hosszú (több karakteres) kapcsolókat szeretnél, azt --ad formában kell megadnod, de ekkor a getopts nem jó neked, helyette egy while test -n "$1" ciklusban kell a "$1"-et vizsgálnod, és a case ágak végén egy-egy shift-tel kirotálni az aktuális kapcsolót (illetve ha paraméter is tartozik hozzá, akkor azt a $2-ból tudod venni, és shift 2 kell utána).

./progi -a
./progi --ad

A getopts csak az egybetűs argumentumokat és paraméterét képes kezelni.
Van egy getopt nevű segédprogram a Linuxokban, amely getopt -l "ad,masik" módon képes kezelni a long argumentumokat. Esetleg ez jó lehet neked.

$ getopt -l "ad:,masik" -o 'ad:m' -- --ad parametere --masik -am -d dparameter
# élesben a tesztparaméterek helyett -- "$@"

Ezt már egyszerű shellből feldolgozni.
Bővebben:
    https://www.baeldung.com/linux/bash-parse-command-line-arguments
    3. Parsing Long Command-Line Options With getopt     részben.