Como argumentos de línea de comandos de acceso de la persona que llama dentro de una función?

StackOverflow https://stackoverflow.com/questions/2740906

Pregunta

Estoy intentando escribir una función en bash que tendrá acceso a los argumentos de línea de comandos secuencias de comandos, pero son reemplazados por los argumentos posicionales a la función. ¿Hay alguna forma para la función para acceder a los argumentos de línea de comandos si no se adoptan en forma explícita?

# Demo function
function stuff {
  echo $0 $*
}

# Echo's the name of the script, but no command line arguments
stuff

# Echo's everything I want, but trying to avoid
stuff $*
¿Fue útil?

Solución

Mi lectura del manual de bash ref dice estas cosas es capturado en BASH_ARGV, aunque se habla de "la pila" mucho.

#!/bin/bash

function argv {
    for a in ${BASH_ARGV[*]} ; do
      echo -n "$a "
    done
    echo
}

function f {
    echo f $1 $2 $3
    echo -n f ; argv
}

function g {
    echo g $1 $2 $3
    echo -n g; argv
    f
}

f boo bar baz
g goo gar gaz

Guardar en f.sh

$ ./f.sh arg0 arg1 arg2
f boo bar baz
farg2 arg1 arg0 
g goo gar gaz
garg2 arg1 arg0 
f
farg2 arg1 arg0 

Otros consejos

Si usted quiere tener su estilo C argumentos (array de parámetros + número de argumentos) que puede utilizar $@ y $#.

$# le da el número de argumentos.
$@ le da todos los argumentos. Usted puede convertir esto en una matriz por args=("$@").

Así, por ejemplo:

args=("$@")
echo $# arguments passed
echo ${args[0]} ${args[1]} ${args[2]}

Tenga en cuenta que aquí ${args[0]} realidad es la primera argumento y no el nombre de su script.

Comentario de Ravi es esencialmente la respuesta. Funciones toman sus propios argumentos. Si usted quiere que sean los mismos que los argumentos de línea de comandos, debe pasar a ellos. De lo contrario, usted está llamando claramente una función sin argumentos.

Dicho esto, lo que podría si te gusta tienda de los argumentos de línea de comandos en una matriz global para el uso dentro de otras funciones:

my_function() {
    echo "stored arguments:"
    for arg in "${commandline_args[@]}"; do
        echo "    $arg"
    done
}

commandline_args=("$@")

my_function

Usted tiene que acceder a los argumentos de línea de comandos a través de la variable commandline_args, no $@, $1, $2, etc., pero que están disponibles. Estoy al tanto de ninguna manera de asignar directamente a la matriz de argumentos, pero si alguien sabe uno, por favor me ilumine!

Además, tenga en cuenta la forma en que he usado y $@ la cita - así es como se asegura de caracteres especiales (espacio en blanco) no quedar estropeado

.
#!/usr/bin/env bash

echo name of script is $0
echo first argument is $1
echo second argument is $2
echo seventeenth argument is $17
echo number of arguments is $#

Edit: por favor ver mi comentario sobre la pregunta

# Save the script arguments
SCRIPT_NAME=$0
ARG_1=$1
ARGS_ALL=$*

function stuff {
  # use script args via the variables you saved
  # or the function args via $
  echo $0 $*
} 


# Call the function with arguments
stuff 1 2 3 4

Uno puede hacerlo de esta manera, así

#!/bin/bash
# script_name function_test.sh
function argument(){
for i in $@;do
    echo $i
done;
}
argument $@

Ahora llama a tu guión como

./function_test.sh argument1 argument2

Se puede utilizar la palabra clave de cambio (operador?) Para iterar a través de ellos. Ejemplo:

#!/bin/bash
function print()
{
    while [ $# -gt 0 ]
    do
        echo $1;
        shift 1;
    done
}
print $*;
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top