Tengo un script simple donde el primer argumento está reservado para el nombre de archivo, y todos los demás argumentos opcionales deben pasar a otras partes del script.
Utilizando Google, encontré esta wiki , pero proporcionaba un ejemplo literal:
echo "${@: -1}"
No puedo hacer nada más para trabajar, como:
echo "${@:2}"
o
echo "${@:2,1}"
Recibo “Mala sustitución” de la terminal.
¿Cuál es el problema y cómo puedo procesar todo menos el primer argumento pasado a un script bash?
Utilizar esta:
echo "${@:2}"
La siguiente syntax:
echo "${*:2}"
funcionaría también, pero no se recomienda, porque como @Gordon ya explicó, que al usar *
, ejecuta todos los argumentos juntos como un único argumento con espacios, mientras que @
conserva las interrupciones entre ellos (incluso si algunos de los argumentos son contener espacios). No hace la diferencia con el echo
, pero es importante para muchos otros comandos.
Si quieres una solución que también funcione en /bin/sh
try
first_arg="$1" shift echo First argument: "$first_arg" echo Remaining arguments: "$@"
shift [n]
desplaza los parámetros posicionales n veces. Un shift
establece el valor de $1
en el valor de $2
, el valor de $2
en el valor de $3
, y así sucesivamente, disminuyendo el valor de $#
en uno.
http://wiki.bash-hackers.org/scripting/posparams
Explica el uso de shift
(si desea descartar los primeros N parámetros) y luego implementa Mass Usage (busque el encabezado con ese título).