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