tutorial script parameter example espaƱol create check bash command-line-arguments

parameter - create bash script linux



Propagar todos los argumentos en un script de shell bash (8)

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, mi nombre de script es foo.sh y llama a bar.sh

foo.sh:

bar $1 $2 $3 $4

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


Funciona bien, excepto si tiene espacios o caracteres escapados. No encuentro la forma de capturar argumentos en este caso y enviarlos a un 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(/^[a-z] /,"&@",$i) ; gsub(/ $/,"",$i );gsub (/$/,"@",$i) }; print $0 }'' | tr ''@'' /' )


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, ejecuta 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 es $ {@}. Por ejemplo,

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

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


Para bash y otras conchas de tipo Bourne:

java com.myserver.Program "$@"


Si incluye $@ en una cadena entrecomillada con otros caracteres, el comportamiento es muy extraño cuando hay varios argumentos, solo se incluye el primer argumento 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 a 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''


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

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

De Bash por ejemplo .


Use "$@" lugar de $@ simple si realmente desea que sus parámetros se 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:


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

Simplemente pensé que esto podría ser un poco más útil al intentar probar cómo entran los argumentos en su script