Mam ten kod -
#getoptDemo.sh
usage()
{
echo "usage: <command> options:<w|l|h>"
}
while getopts wlh: option
do
case $option in
(w)
name='1';;
(l)
name='2';;
(h)
name='3';;
(*)
usage
exit;;
esac
done
print 'hi'$name
Kiedy uruchamiam bash getoptDemos.sh
(bez opcji), drukuje hi
zamiast wywoływać funkcję usage
. Wywołuje użycie, gdy podano opcje inne niż w, h i l. To nie może działać, gdy nie określono żadnych opcji.
Próbowałem za pomocą ?
, \?
, :
w miejscu *
, ale nie mogę osiągnąć to, co chciałem. Mam na myśli, że wszystko wskazuje docs
na getopt
to, aby używać ?
.
Co ja robię źle?
/bin/bash
Odpowiedzi:
Kiedy uruchomisz ten skrypt bez żadnych opcji, getopt zwróci false, więc w ogóle nie wejdzie w pętlę. Po prostu spadnie do wydruku - czy to ksh / zsh?
Jeśli musisz mieć opcję, najlepiej jest przetestować $ name po pętli.
Ale upewnij się, że
$name
był pusty przed wywołaniemgetopts
(ponieważ$name
w środowisku mogło być otoczenie, które powłoka otrzymywała podczas uruchamiania)(przed
getopts
pętlą)źródło
no argument
warunek za pomocą bash.getopts
że nie ma takiego przepisu. Co gorsze, to nie mogę cię głosować.getopts
przetwarza opcje kolejno. To jest jego praca. Jeśli zdarzy się, że użytkownik nie przekaże żadnej opcji, pierwsze wywołanie metodygetopts
kończy pętlę while.Jeśli żadna z opcji nie przyjmuje argumentu, wartość
OPTIND
wskazuje, ile opcji zostało przekazanych. Ogólnie rzecz biorąc,OPTIND
jest to liczba argumentów, które są opcjami lub argumentami opcji, w przeciwieństwie do argumentów innych niż opcje (operandów).W każdym razie nie próbujesz ustalić, czy nie było żadnych opcji, ale czy żadna z
name
opcji -set nie została przekazana. Więc sprawdź, czyname
jest rozbrojony (i staraj się go najpierw rozbroić) .źródło
bash sample.sh -abc file.txt
to daje -1 non-option arguments
. jak mogę dowiedzieć się, ile opcji zostało podanych. (tutaj 3)Jeśli twój skrypt musi otrzymać argumenty opcji, umieść ten blok na początku (przed getops).
Blok sprawdza, czy łańcuch parametrów nie zaczyna się od
-
symbolu, co wskazuje, że pierwszy parametr nie jest argumentem opcji.źródło
Sprawdziłbym to za pomocą zmiennej. Jeśli getopts nigdy nie przejdzie pętli w przypadku braku argumentu, możesz użyć tego na przykład w następujący sposób:
źródło
Tuż przed
getopts
blokiem sprawdź, czy$1
(pierwszy argument / opcja przekazany w wierszu poleceń) jest pusty. Jeśli tak, wydrukuj komunikat o użytkowaniu i wyjdź (lub uruchom funkcję „brak opcji”, jeśli jesteś anarchistą), w przeciwnym razie pozwólgetopts
przeanalizować opcje jak zwykle.Powodem, dla którego ta funkcja nie jest zawarta w getopts, jest to, że można ją już wykonać w trybie bash za pomocą „if-else”. Przykład:
Ma sens?
źródło