2012-08-17 27 views
7

Google finalmente me ha fallado. Parece que no puedo encontrar cómo hacer esto en las secuencias de comandos shell de Bourne:

Estoy escribiendo un script de shell para manejar todas mis pruebas para un proyecto. He configurado funciones para cada tarea que este script podría hacer (compilar, ejecutar, limpiar, etc.) y me gustaría pasar cualquier parámetro adicional de la línea de comandos (además del comando) a la función deseada.

Ejemplo:

./test.sh build -j debe pasar -j en la función de build.

Una versión pseudo-código de esta lógica se vería así:

function build() { 
    make $* 
} 

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

¿Cómo puedo lograr esto?

Respuesta

9

Creo que podría lograr este efecto con el comando shift. Moverá todos los parámetros posicionales hacia abajo y perderá el valor de $1 (por lo que el valor de $3 se moverá a $2, el valor de $2 se moverá a $1 y se perderá el valor de $1). Una vez que hayas hecho eso, puedes usar [email protected] para obtener la lista de argumentos que realmente te interesan, p.

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

Debería usar '" $ @ "' en la invocación de 'build', pero de lo contrario se mantendría al día. –

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

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

Nota el uso de "[email protected]" tanto en la propia función y en la invocación de la función. Yo diría que rara vez es correcto usar $* o [email protected] sin las comillas dobles o "$*"; solo "[email protected]" conserva el espaciado de la lista de argumentos original, lo que importa si tiene argumentos que contienen espacios. Si va a hacer eco de los argumentos, entonces echo "The arguments: $*" es razonable. De lo contrario, más del 90% de las veces, sería mejor que usas "[email protected]". También tomo una actitud extremadamente conservadora hacia citar "$1" en el operador de prueba; tenga cuidado al omitir las comillas.

Consulte también:

2

A menos que usted está deseando para emitir un mensaje de error más detallado, no hay necesidad de probar $1 explícitamente. Sólo hacer:

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

"[email protected]" 

If $1 nombres de una función válida, se llama como se desee. Si no lo hace, recibirá un mensaje de error que probablemente no sea tan malo, dependiendo de su caparazón.

Cuestiones relacionadas