¿Por qué $1 en una función no imprime el primer argumento del script?

¿Por qué $1 en una función no imprime el primer argumento del script?

¿Por qué no se echo $1imprime $1en este sencillo script bash?

#!/bin/bash
# function.sh
print_something () {
echo $1
}
print_something

$ ./function.sh 123  -> why doesn't it print '123' as a result?

Respuesta1

Los parámetros posicionales se refieren a los argumentos del script en el nivel principal del script, pero aargumentos de funciónen el cuerpo funcional. Entonces

print_something Something

en realidad imprimiría Something.

Si desea pasar los argumentos del script a una función, debe hacerlo explícitamente. Usar

print_something "$1"

para pasar el primer argumento, o

print_something "$@"

para pasarlos todos, aunque la función del ejemplo solo usa el primero.

Respuesta2

Esto se debe a que una función llamada obtiene su propio conjunto de parámetros posicionales, independientemente del conjunto del padre o de la persona que llama. Intentar

print_something "$1"

(y echo "$1", o mejor aún printf '%s\n' "$1", recuerde citar expansiones de parámetros que echono se pueden usar para datos arbitrarios).

información relacionada