2012-08-17 4 views
7

Google mi ha finalmente fallito. Non riesco a trovare come farlo nello scripting della shell Bourne:

Sto scrivendo uno script di shell per gestire tutti i miei test per un progetto. Ho impostato le funzioni per ogni attività che questo script potrebbe fare (creare, eseguire, pulire, ecc.) E vorrei passare qualsiasi parametro della riga di comando aggiuntivo (oltre al comando stesso) sulla funzione desiderata.

Esempio:

./test.sh build -j dovrebbe passare -j nella funzione build.

Una versione pseudo-codice di questa logica sarà simile:

function build() { 
    make $* 
} 

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

Come posso fare questo?

risposta

9

Penso che potresti ottenere questo effetto utilizzando il comando shift. Sposterà tutti i parametri posizionali verso il basso di un posto e rilascerà il valore di $1 (quindi il valore di $3 viene spostato su $2, il valore di $2 viene spostato su $1 e il valore di $1 viene perso). Dopo averlo fatto, puoi semplicemente utilizzare [email protected] per raccogliere l'elenco di argomenti a cui sei effettivamente interessato, ad es.

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

Si dovrebbe usare "" $ @ "' nell'invocazione di 'build', ma in caso contrario avvistare. –

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

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

noti l'uso di "[email protected]" sia nella funzione stessa e l'invocazione della funzione. Direi che raramente è corretto utilizzare $* o [email protected] senza le virgolette doppie o "$*"; solo "[email protected]" conserva la spaziatura dell'elenco di argomenti originale, che è importante se si hanno argomenti che contengono spazi. Se hai intenzione di echo gli argomenti, allora echo "The arguments: $*" è ragionevole. Altrimenti, più del 90% delle volte, staresti meglio usando "[email protected]". Prendo anche un atteggiamento estremamente prudente nei confronti della quotazione di "$1" nell'operatore di test; sii cauto nell'omettere le citazioni.

Consulta anche:

2

A meno che non si vogliono emettere un messaggio di errore più dettagliato, non c'è bisogno di testare $1 in modo esplicito. Basta fare:

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

"[email protected]" 

If $1 nomi una funzione valida, sarà chiamato, se lo desideri. In caso contrario, riceverai un messaggio di errore che probabilmente non è male, a seconda della shell.

Problemi correlati