Estoy intentando escribir una función en bash que acceda a los argumentos de la línea de comandos de los scripts, pero se reemplazan con los argumentos posicionales de la función. ¿Hay alguna forma de que la función acceda a los argumentos de la línea de comando si no se pasan explícitamente?
# 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 $*
bash
command-line-arguments
argv
DonGar
fuente
fuente
$*
es extremadamente cochecito - que va a cambiar./yourScript "first argument" "second argument"
a./yourscript "first" "argument" "second" "argument"
, o cambiar./yourscript '*.txt'
a algo así como./yourscript one.txt two.txt
a pesar de las cotizaciones.Respuestas:
Mi lectura del manual bash ref dice que estas cosas están capturadas en BASH_ARGV, aunque habla mucho de "la pila".
Guardar en f.sh
fuente
Si desea tener sus argumentos en estilo C (matriz de argumentos + número de argumentos) puede usar
$@
y$#
.$#
te da el número de argumentos.$@
te da todos los argumentos. Puede convertir esto en una matriz medianteargs=("$@")
.Así por ejemplo:
Tenga en cuenta que aquí
${args[0]}
está el primer argumento y no el nombre de su script.fuente
args
matriz desde dentro de una función, si la inicializa de antemano como se describe.echo "${args[0]} ${args[1]} ${args[2]}"
, o los argumentos están sujetos a la expansión del nombre de archivo.Editar: consulte mi comentario sobre la pregunta
fuente
El comentario de Ravi es esencialmente la respuesta. Las funciones toman sus propios argumentos. Si desea que sean los mismos que los argumentos de la línea de comandos, debe pasarlos. De lo contrario, claramente está llamando a una función sin argumentos.
Dicho esto, si lo desea, puede almacenar los argumentos de la línea de comandos en una matriz global para usarlos en otras funciones:
Usted tiene que acceder a los argumentos de línea de comandos a través de la
commandline_args
variable no$@
,$1
,$2
, etc, pero están disponibles. No conozco ninguna forma de asignar directamente a la matriz de argumentos, pero si alguien conoce una, ¡ilumíneme!Además, observe la forma en que he usado y citado
$@
: así es como se asegura de que los caracteres especiales (espacios en blanco) no se estropeen.fuente
fuente
Uno puede hacerlo así también
Ahora llama a tu guión como
fuente
function print() {
es una amalgama entre dos formas de declaración de función diferentesfunction print {
, que es la sintaxis de ksh heredada que bash admite para compatibilidad con versiones anteriores de ksh pre-POSIX (es decir, pre-1991) yprint() {
, que está estandarizado por POSIX. Considere usar uno u otro para una mayor compatibilidad con otros proyectiles; ver también wiki.bash-hackers.org/scripting/obsoletePuede utilizar la palabra clave shift (¿operador?) Para recorrerlos. Ejemplo:
fuente
function print() {
es una amalgama entre dos formas de declaración de función diferentesfunction print {
, que es la sintaxis de ksh heredada que bash admite para compatibilidad con versiones anteriores de ksh pre-POSIX (es decir, pre-1991), yprint() {
que está estandarizado por POSIX. Considere usar uno u otro para una mayor compatibilidad con otros proyectiles; ver también wiki.bash-hackers.org/scripting/obsoleteMi solución:
Cree un script de función que se llame antes que todas las demás funciones sin pasarle ningún argumento, como este:
Después de eso, puede llamar a init y usar la var ORIGOPT según sea necesario, como un plus, siempre asigno una nueva var y copio el contenido de ORIGOPT en mis nuevas funciones, de esa manera puede asegurarse de que nadie lo tocará o cambialo.
Agregué espacios y guiones para que sea más fácil analizarlo con 'sed -E', además, bash no lo pasará como referencia y hará que ORIGOPT crezca a medida que las funciones se llaman con más argumentos.
fuente