Pase los parámetros de la línea de comandos a un programa dentro del script de shell

15

En cuanto a ./script.sh arg1 [arg2 arg3 ...]los argumentos de línea de comandos arg1, arg2, ... se puede conseguir mediante $1, $2, ... Sin embargo, el número de argumentos es NO fijo.

En el script de shell, quiero pasar los argumentos a partir de arg2un programa,

#/bin/bash
...
/path/to/a/program [I want to pass arg2 arg3 ... to the program]
...

¿Cómo podría hacerlo ya que podría haber uno o más argumentos?

Sotavento
fuente

Respuestas:

17

La forma habitual sería guardar una copia de arg1 ( "$1") y cambiar los parámetros por uno, para que pueda consultar la lista completa como "$@":

#!/bin/sh
arg1="$1"
shift 1
/path/to/a/program "$@"

bash tiene cierto soporte de matriz, por supuesto, pero no es necesario para la pregunta como se plantea.

Si incluso arg1 es opcional, lo verificaría así:

if [ $# != 0 ]
then
    arg1="$1"
    shift 1
fi
Thomas Dickey
fuente
¿Son necesarias las comillas dobles cuando se usa $@?
Lee
1
Las comillas dobles con $@le dicen al shell que doble comillas cada parámetro (algo bueno que hacer si los parámetros contienen caracteres interesantes como paréntesis o asteriscos). Si no te importa, eso $*funciona ...
Thomas Dickey
66
@Lee Sí, las comillas dobles son necesarias. De lo contrario, en lugar de pasar por la lista de argumentos, cada argumento se divide en espacios en blanco, luego cada pieza se interpreta como un patrón comodín y, si el patrón coincide, se reemplaza por la lista de coincidencias. En términos generales, siempre sustituciones dobles de comillas .
Gilles 'SO- deja de ser malvado'
10

Puede cortar los parámetros posicionales utilizando la expansión de parámetros. La sintaxis es:

${parameter:offset:length}

Si lengthse omite, se toma como hasta el último valor.

Como iba a pasar del segundo al último argumento, necesita:

${@:2}

Ejemplo:

$ foo() { echo "${@:2}" ;}

$ foo bar spam egg
spam egg
heemayl
fuente