¿Por qué no echo $1
imprime $1
en este simple script bash?
#!/bin/bash
# function.sh
print_something () {
echo $1
}
print_something
$ ./function.sh 123 -> why doesn't it print '123' as a result?
¿Por qué no echo $1
imprime $1
en este simple script bash?
#!/bin/bash
# function.sh
print_something () {
echo $1
}
print_something
$ ./function.sh 123 -> why doesn't it print '123' as a result?
Respuestas:
Los parámetros posicionales se refieren a los argumentos del script en el nivel principal del script, pero a los argumentos de función en el cuerpo de la función. Entonces
print_something Something
En realidad se imprimiría Something
.
Si desea pasar los argumentos del script a una función, debe hacerlo explícitamente. Utilizar
print_something "$1"
para pasar el primer argumento, o
print_something "$@"
para pasarlos todos, aunque la función en el ejemplo solo usa el primero.
"$@"
a print_something
, como está escrito actualmente, todavía solo imprimiría el primero de los argumentos.
"$*"
sería una sola cadena (unida en el primer carácter de $IFS
) mientras "$@"
que sería una lista de elementos citados individualmente.
"$@"
, incluso si en este caso solo hay uno de esos parámetros, es cubrir todos esos casos. Si el OP decide agregar un segundo parámetro, no hay nada que cambiar en la invocación de la función. Y todos los que lean esto aprenderán la forma correcta de hacerlo para evitar tener que volver a hacerlo más tarde también.
Esto se debe a que una función llamada obtiene su propio conjunto de parámetros posicionales, independientemente del conjunto del padre / interlocutor. Tratar
print_something "$1"
(y echo "$1"
, o mejor aún printf '%s\n' "$1"
, recuerde citar expansiones de parámetros y eso echo
no se puede usar para datos arbitrarios).
$1
generalmente es diferente de la función $1
, aunque PUEDE volverse la misma si se usa como se propuso anteriormente. Si lo entiendo bien, echo
puede permanecer igual ( echo $1
) cuando se llama a la función con parámetros únicos ( print_something $2
toma el $ 1 de la persona que llama y lo " $1
echo $1
no tiene sentido a menos que desee $1
ser tratado como una lista de patrones de archivos delimitados por $ IFS para expandirse. echo "$1"
tendría más sentido, aunque no generaría el contenido de $1
valores $1
similares -nene
, -EE
...