Nie jestem facetem od Linuksa, ale utknąłem w skrypcie, który muszę przeczytać w moim Projekcie. Czy więc ktoś może mi pomóc w wykonywaniu tego polecenia?
shift $(($optind - 1))
Nie jestem facetem od Linuksa, ale utknąłem w skrypcie, który muszę przeczytać w moim Projekcie. Czy więc ktoś może mi pomóc w wykonywaniu tego polecenia?
shift $(($optind - 1))
Odpowiedzi:
shift $((OPTIND-1))
(uwaga OPTIND
jest pisana wielkimi literami) zwykle znajduje się natychmiast po getopts
while
pętli. $OPTIND
jest liczba znalezionych przez opcji getopts
.
Jak pauljohn32 wspomina w komentarzach, mówiąc ściśle, OPTIND
podaje pozycję następnego argumentu wiersza poleceń.
Z podręcznika GNU Bash Reference :
getopts optstring name [args]
getopts
jest używany przez skrypty powłoki do analizowania parametrów pozycyjnych.optstring
zawiera znaki opcji do rozpoznania; jeśli po znaku następuje dwukropek, opcja powinna zawierać argument, który powinien być od niej oddzielony spacją. Dwukropka („:”) i znaku zapytania („?”) Nie można używać jako znaków opcji. Za każdym razem, gdy jest wywoływana,getopts
umieszcza następną opcję w nazwie zmiennej powłoki, inicjując,name
jeśli nie istnieje, oraz indeks następnego argumentu, który ma zostać przetworzony na zmiennąOPTIND
.OPTIND
jest inicjowany na 1 za każdym razem, gdy wywoływana jest powłoka lub skrypt powłoki. Gdy opcja wymaga argumentu, getopts umieszcza ten argument w zmiennejOPTARG
. Powłoka nie resetuje sięOPTIND
automatycznie; musi zostać ręcznie zresetowany między wieloma wywołaniami wgetopts
ramach tego samego wywołania powłoki, jeśli ma być użyty nowy zestaw parametrów.Po napotkaniu końca opcji następuje
getopts
wyjście z wartością zwracaną większą od zera.OPTIND
jest ustawiony na indeks pierwszego argumentu nie będącego opcją, a nazwa jest ustawiona na „?”.
getopts
normalnie analizuje parametry pozycyjne, ale jeśli podano więcej argumentówargs
,getopts
analizuje je zamiast tego.
shift
n
usuwa n ciągów z listy parametrów pozycyjnych. W ten sposób shift $((OPTIND-1))
usuwa wszystkie przeanalizowane opcje getopts
z listy parametrów, a więc po tym punkcie $1
będzie odnosił się do pierwszego nieopcji argumentu przekazanego do skryptu.
Aktualizacja
Jak mikeserv wspomina w komentarzu, shift $((OPTIND-1))
może być niebezpieczne. Aby zapobiec niechcianemu dzieleniu słów itp., Wszystkie rozszerzenia parametrów powinny być cytowane. Tak więc bezpieczną formą polecenia jest
shift "$((OPTIND-1))"
find
) mogą wyglądać, jakby dopuszczały opcje po braku opcji, ale nie mają: mają operandy, które zaczynają się od myślnika.
IFS
, ale lepiej być bezpiecznym niż żałować. ;)
IFS=0123456789
, shift $((OPTIND-1))
(bez cudzysłowów) zmieni się w, shift ""
który zostanie po cichu zignorowany (in ksh
) lub wygeneruje błąd (in bash
i dash
).
$((...))
po prostu oblicza rzeczy. W twoim przypadku bierze ona wartość $optint
i odejmuje 1.
shift
usuwa parametry pozycyjne. W twoim przypadku usuwa optint-1
parametry.
Aby uzyskać więcej informacji zajrzyj na help getopts
, help shift
, spojrzenie man bash
na „arytmetycznego”, a zwłaszcza google getopts
.