2012-08-17 16 views
7

Google w końcu mnie zawiódł. Nie mogę tego znaleźć w skryptach powłoki Bourne'a: ​​

Piszę skrypt powłoki, aby obsłużyć wszystkie moje testy dla projektu. Skonfigurowałem funkcje dla każdego zadania, które ten skrypt może wykonać (budować, uruchamiać, czyścić, itp.) I chciałbym przekazać dowolne dodatkowe parametry wiersza polecenia (poza samym poleceniem) na pożądaną funkcję.

przykład:

./test.sh build -j powinny przechodzić -j do funkcji build.

Wersja pseudo-kod tej logiki wyglądałby następująco:

function build() { 
    make $* 
} 

if [ $1 == 'build' ]; then 
    build $2 -> $N 
fi 

W jaki sposób można to osiągnąć?

Odpowiedz

9

Myślę, że można osiągnąć ten efekt za pomocą polecenia shift. Spowoduje to przesunięcie wszystkich parametrów pozycji w dół o jedno miejsce i zmniejszy wartość $1 (wartość $3 zostanie przeniesiona do $2, wartość $2 zostanie przeniesiona do $1, a wartość $1 zostanie utracona). Kiedy już to zrobisz, możesz po prostu użyć [email protected], aby wybrać listę argumentów, które naprawdę Cię interesują.

function build() { 
    echo "build with [email protected]" 
} 

echo "Starting args are [email protected]" 
cmd=$1 
shift 

if [ "$cmd" = 'build' ]; then 
    build "[email protected]" 
fi 
+1

Powinieneś użyć '" $ @ "' w inwokacji 'build', ale w przeciwnym razie możesz na miejscu. –

5
function build() { 
    make "[email protected]" 
} 

if [ "$1" == 'build' ] 
then shift  # Lose $1 
    build "[email protected]" # Pass what was $2 .. $N 
fi 

Uwaga wykorzystanie "[email protected]" zarówno w samej funkcji i wezwaniem funkcji. Twierdzę, że rzadko używa się $* lub [email protected] bez podwójnych cytatów lub "$*"; tylko "[email protected]" zachowuje odstępy od oryginalnej listy argumentów, co ma znaczenie, jeśli masz argumenty zawierające spacje. Jeśli masz zamiar powtórzyć argumenty, to rozsądne jest echo "The arguments: $*". W przeciwnym razie, w ponad 90% przypadków lepiej byłoby użyć numeru "[email protected]". Podejmuję także bardzo konserwatywne podejście do cytowania "$1" w operatorze testu; zachowaj ostrożność, pomijając cytaty.

Zobacz także:

2

Jeśli nie chcąc emitują bardziej szczegółowy komunikat o błędzie, nie ma potrzeby, aby przetestować $1 wyraźnie. Wystarczy zrobić:

#!/bin/sh -e 
function build() { 
    make "[email protected]" 
} 

"[email protected]" 

jeśli $1 nazwy ważna funkcja, zostanie ona wywołana jako pożądane. Jeśli nie, otrzymasz komunikat o błędzie, który prawdopodobnie nie jest zły, w zależności od powłoki.