¿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?
bash
shell-script
function
pietro letti
fuente
fuente

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
En realidad se imprimiría
Something.Si desea pasar los argumentos del script a una función, debe hacerlo explícitamente. Utilizar
para pasar el primer argumento, o
para pasarlos todos, aunque la función en el ejemplo solo usa el primero.
fuente
"$@"aprint_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
(y
echo "$1", o mejor aúnprintf '%s\n' "$1", recuerde citar expansiones de parámetros y esoechono se puede usar para datos arbitrarios).fuente
$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 "$1echo $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...