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 OPTINDjest pisana wielkimi literami) zwykle znajduje się natychmiast po getopts whilepętli. $OPTINDjest liczba znalezionych przez opcji getopts.
Jak pauljohn32 wspomina w komentarzach, mówiąc ściśle, OPTINDpodaje pozycję następnego argumentu wiersza poleceń.
Z podręcznika GNU Bash Reference :
getopts optstring name [args]
getoptsjest używany przez skrypty powłoki do analizowania parametrów pozycyjnych.optstringzawiera 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,getoptsumieszcza następną opcję w nazwie zmiennej powłoki, inicjując,namejeśli nie istnieje, oraz indeks następnego argumentu, który ma zostać przetworzony na zmiennąOPTIND.OPTINDjest 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ęOPTINDautomatycznie; musi zostać ręcznie zresetowany między wieloma wywołaniami wgetoptsramach tego samego wywołania powłoki, jeśli ma być użyty nowy zestaw parametrów.Po napotkaniu końca opcji następuje
getoptswyjście z wartością zwracaną większą od zera.OPTINDjest ustawiony na indeks pierwszego argumentu nie będącego opcją, a nazwa jest ustawiona na „?”.
getoptsnormalnie analizuje parametry pozycyjne, ale jeśli podano więcej argumentówargs,getoptsanalizuje 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 getoptsz listy parametrów, a więc po tym punkcie $1bę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 bashi dash).
$((...))po prostu oblicza rzeczy. W twoim przypadku bierze ona wartość $optinti odejmuje 1.
shiftusuwa parametry pozycyjne. W twoim przypadku usuwa optint-1parametry.
Aby uzyskać więcej informacji zajrzyj na help getopts, help shift, spojrzenie man bashna „arytmetycznego”, a zwłaszcza google getopts.