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

13

¿Por qué no echo $1imprime $1en 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?
pietro letti
fuente
66
porque olvidó los $ 1 al llamar a print_something. Intente incluir texto en la pregunta y no en el título.
Rui F Ribeiro
Gracias. ¿Cuál debería ser el argumento echo si necesito insertar en el script los comandos: print_something "$ 1"; print_something "$ 2"; y tal vez mas?
pietro letti
13
Cuando vi esto en HNQ pensé que estabas imprimiendo billetes de un dólar y esperaba leer una jugosa historia sobre cómo tu impresora detecta que estás imprimiendo dinero falso.
tubería
@pipe Me ha pasado eso antes, por alguna razón se niega a imprimir cualquier cosa, no solo las que tienen las prevenciones anti-impresión.
Codingale

Respuestas:

41

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.

weirdan
fuente
1
Pasar "$@"a print_something, como está escrito actualmente, todavía solo imprimiría el primero de los argumentos.
Kusalananda
13
Pero supongo que el punto era mostrar cómo pasar todos los argumentos. El hecho de que la función, tal como está, solo use el primero de sus argumentos es un poco irrelevante.
weirdan
Bueno, solo pensar que no tiene sentido pasar todos los argumentos si solo se usa el primero.
Kusalananda
14
@allo No. "$*"sería una sola cadena (unida en el primer carácter de $IFS) mientras "$@"que sería una lista de elementos citados individualmente.
Kusalananda
55
@Kusalananda el punto de decirle a alguien que quiere pasar los parámetros de la línea de comandos a una función para usar "$@", 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.
Monty Harder
10

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 echono se puede usar para datos arbitrarios).

RudiC
fuente
Necesita ser más claro de lo que está hablando. La persona que llama $1generalmente es diferente de la función $1, aunque PUEDE volverse la misma si se usa como se propuso anteriormente. Si lo entiendo bien, echopuede permanecer igual ( echo $1) cuando se llama a la función con parámetros únicos ( print_something $2toma el $ 1 de la persona que llama y lo " $1
ingresa
66
El uso echo $1no tiene sentido a menos que desee $1ser 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 $1valores $1similares -nene, -EE...
Stéphane Chazelas