Propagar todos los argumentos en un script bash shell

Estoy escribiendo un script muy simple que llama a otro script, y necesito propagar los parámetros de mi script actual al script que estoy ejecutando.

Por ejemplo, el nombre de mi script es foo.sh y me llama bar.sh

foo.sh:

 bar $1 $2 $3 $4 

¿Cómo puedo hacer esto sin especificar explícitamente cada parámetro?

Use "$@" lugar de simple $@ si realmente desea que sus parámetros pasen de la misma manera.

Observar:

 $ cat foo.sh #!/bin/bash baz.sh $@ $ cat bar.sh #!/bin/bash baz.sh "$@" $ cat baz.sh #!/bin/bash echo Received: $1 echo Received: $2 echo Received: $3 echo Received: $4 $ ./foo.sh first second Received: first Received: second Received: Received: $ ./foo.sh "one quoted arg" Received: one Received: quoted Received: arg Received: $ ./bar.sh first second Received: first Received: second Received: Received: $ ./bar.sh "one quoted arg" Received: one quoted arg Received: Received: Received: 

Para bash y otras conchas tipo Bourne:

 java com.myserver.Program "$@" 

Use "$@" (funciona para todos los compatibles con POSIX ).

[…], bash presenta la variable “$ @”, que se expande a todos los parámetros de línea de comando separados por espacios.

De Bash por ejemplo .

 #!/usr/bin/env bash while [ "$1" != "" ]; do echo "Received: ${1}" && shift; done; 

Solo pensé que esto podría ser un poco más útil cuando trates de probar cómo entran los args en tu script

Me doy cuenta de que esto ha sido bien respondido, pero aquí hay una comparación entre “$ @” $ @ “$ *” y $ *

Contenido del script de prueba:

 # cat ./test.sh #!/usr/bin/env bash echo "=================================" echo "Quoted DOLLAR-AT" for ARG in "$@"; do echo $ARG done echo "=================================" echo "NOT Quoted DOLLAR-AT" for ARG in $@; do echo $ARG done echo "=================================" echo "Quoted DOLLAR-STAR" for ARG in "$*"; do echo $ARG done echo "=================================" echo "NOT Quoted DOLLAR-STAR" for ARG in $*; do echo $ARG done echo "=================================" 

Ahora, ejecute el script de prueba con varios argumentos:

 # ./test.sh "arg with space one" "arg2" arg3 ================================= Quoted DOLLAR-AT arg with space one arg2 arg3 ================================= NOT Quoted DOLLAR-AT arg with space one arg2 arg3 ================================= Quoted DOLLAR-STAR arg with space one arg2 arg3 ================================= NOT Quoted DOLLAR-STAR arg with space one arg2 arg3 ================================= 

Mi SUN Unix tiene muchas limitaciones, incluso “$ @” no se interpretó como se desea. Mi solución alternativa es $ {@}. Por ejemplo,

 #!/bin/ksh find ./ -type f | xargs grep "${@}" 

Por cierto, tenía que tener este script en particular porque mi Unix tampoco es compatible con grep -r

Funciona bien, excepto si tiene espacios o caracteres escapados. No encuentro la manera de capturar argumentos en este caso y enviarlos a ssh dentro del script.

Esto podría ser útil, pero es tan feo

 _command_opts=$( echo "$@" | awk -F\- 'BEGIN { OFS=" -" } { for (i=2;i<=NF;i++) { gsub(/^[az] /,"&@",$i) ; gsub(/ $/,"",$i );gsub (/$/,"@",$i) }; print $0 }' | tr '@' \' ) 

Si incluye $@ en una cadena entrecomillada con otros caracteres, el comportamiento es muy extraño cuando hay múltiples argumentos, solo el primer argumento se incluye dentro de las comillas.

Ejemplo:

 #!/bin/bash set -x bash -c "true foo $@" 

Rendimientos:

 $ bash test.sh bar baz + bash -c 'true foo bar' baz 

Pero asignando una variable diferente primero:

 #!/bin/bash set -x args="$@" bash -c "true foo $args" 

Rendimientos:

 $ bash test.sh bar baz + args='bar baz' + bash -c 'true foo bar baz'