parameter - script bash linux ejemplos
Propagar todos los argumentos en un script bash shell (7)
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?
Para bash y otras conchas tipo Bourne:
java com.myserver.Program "$@"
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:
#!/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
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 .
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(/^[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, 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
=================================