Skip to main content

Jak przekazywać argumenty do skryptu Bash

Linux Tutorial for Beginners: Introduction to Linux Operating System (Może 2025)

Linux Tutorial for Beginners: Introduction to Linux Operating System (Może 2025)
Anonim

Możesz napisać skrypt basha tak, aby otrzymał argumenty określone podczas wywoływania skryptu z wiersza poleceń. Ta metoda jest używana, gdy skrypt musi wykonywać nieco inną funkcję w zależności od wartości parametrów wejściowych (argumenty).

Na przykład możesz mieć skrypt o nazwie "stats.sh", który wykonuje określoną operację na pliku, na przykład zliczając jej słowa. Jeśli chcesz móc korzystać z tego skryptu na wielu plikach, najlepiej przekazać nazwę pliku jako argument, aby móc użyć tego samego skryptu do przetwarzania wszystkich plików. Na przykład, jeśli nazwa pliku do przetworzenia to "lista utworów", należy wprowadzić następujący wiersz polecenia:

Lista utworów sh stats.sh

Dostęp do argumentów jest uzyskiwany w skrypcie za pomocą zmiennych 1, 2, 3, itd., Gdzie 1 odnosi się do pierwszego argumentu, 2 $ do drugiego argumentu i tak dalej. Jest to przedstawione w następującym przykładzie:

FILE1 = 1 $wc $ FILE1

Dla czytelności przypisz zmienną o opisowej nazwie do wartości pierwszego argumentu ($ 1), a następnie wywołaj narzędzie liczenia słów (wc) na tej zmiennej ($ FILE1).

Jeśli masz zmienną liczbę argumentów, możesz użyć zmiennej "$ @", która jest tablicą wszystkich parametrów wejściowych. Oznacza to, że możesz użyć pętli for do iteracyjnego przetwarzania każdego, jak pokazano w następującym przykładzie:

dla FILE1 w "$ @"robićwc $ FILE1Gotowe

Oto przykład wywołania tego skryptu z argumentami z wiersza poleceń:

sh stats.sh songlist1 songlist2 songlist3

Jeśli argument ma spacje, musisz załączyć je za pomocą pojedynczych cudzysłowów. Na przykład:

sh stats.sh 'songlist 1' 'songlist 2' 'songlist 3'

Często skrypt jest tak napisany, że użytkownik może przekazywać argumenty w dowolnej kolejności przy użyciu flag. Za pomocą metody flags możesz również opcjonalnie ustawić niektóre argumenty.

Załóżmy, że masz skrypt, który pobiera informacje z bazy danych na podstawie określonych parametrów, takich jak "nazwa użytkownika", "data" i "produkt", i generuje raport w określonym "formacie". Teraz chcesz napisać swój skrypt, abyś mógł przekazać te parametry po wywołaniu skryptu. Może wyglądać tak:

makereport -u jsmith -p notebooks -d 10-20-2011 -f pdf

Bash włącza tę funkcję za pomocą funkcji "getopts". W powyższym przykładzie możesz użyć getopts w następujący sposób:

while getopts u: d: p: f: optionrobićcase "$ {option}"wu) USER = $ {OPTARG} ;;d) DATA = $ {OPTARG} ;;p) PRODUCT = $ {OPTARG} ;;f) FORMAT = $ OPTARG ;;esacGotowe

Jest to pętla while, która używa funkcji "getopts" i tak zwanego "optstring", w tym przypadku "u: d: p: f:", do iteracji argumentów. Pętla while przechodzi przez łańcuch optstring, który zawiera flagi, które mogą być używane do przekazywania argumentów, i przypisuje wartość argumentu podaną dla tej flagi do zmiennej "option". Instrukcja case przypisuje wartość zmiennej "option" do zmiennej globalnej, która może być użyta po przeczytaniu wszystkich argumentów.

Dwukropki w łańcuchu optstring oznaczają, że wartości są wymagane dla odpowiednich flag. W powyższym przykładzie wszystkie flagi są oznaczone dwukropkiem: "u: d: p: f:". Oznacza to, że wszystkie flagi potrzebują wartości. Jeśli na przykład flagi "d" i "f" nie miałyby mieć wartości, łańcuchem optsting będzie "u: dp: f".

Okrężnica na początku łańcucha optstring, na przykład ": u: d: p: f:", ma zupełnie inne znaczenie. Pozwala na obsługę flag, które nie są reprezentowane w łańcuchu. W takim przypadku wartość zmiennej "opcja" jest ustawiona na "?" a wartość "OPTARG" jest ustawiona na nieoczekiwaną flagę. Pozwala wyświetlić odpowiedni komunikat o błędzie informujący użytkownika o błędzie.

Argumenty, które nie są poprzedzone flagą, są ignorowane przez getopts. Jeśli flagi określone w łańcuchu opcji nie są podane podczas wywoływania skryptu, nic się nie dzieje, chyba że specjalnie zajmiesz się tym przypadkiem w kodzie. Wszelkie argumenty, które nie są obsługiwane przez getops, nadal mogą być przechwytywane za pomocą zwykłych zmiennych o wartości 1 $, 2 $ itd.