Por que não echo $1imprime $1neste script simples do bash?
#!/bin/bash
# function.sh
print_something () {
echo $1
}
print_something
$ ./function.sh 123 -> why doesn't it print '123' as a result?
Por que não echo $1imprime $1neste script simples do bash?
#!/bin/bash
# function.sh
print_something () {
echo $1
}
print_something
$ ./function.sh 123 -> why doesn't it print '123' as a result?
Respostas:
Os parâmetros posicionais se referem aos argumentos do script no nível principal do script, mas aos argumentos da função no corpo da função. então
print_something Something
realmente imprimiria Something.
Se você deseja passar os argumentos do script para uma função, faça isso explicitamente. Usar
print_something "$1"
para passar o primeiro argumento, ou
print_something "$@"
para passar todos eles, embora a função no exemplo use apenas o primeiro.
"$@"para print_something, como está escrito atualmente, ainda imprimiria apenas o primeiro dos argumentos.
"$*"seria uma única string (unida no primeiro caractere de $IFS) enquanto "$@"haveria uma lista de elementos entre aspas individuais.
"$@", mesmo que neste caso exista apenas um desses parâmetros, é para cobrir todos esses casos. Se o OP decidir adicionar um segundo parâmetro, não há nada para mudar na chamada da função. E todo mundo que ler isso aprenderá a maneira correta de fazê-lo, para evitar ter que refazê-lo mais tarde também.
Isso ocorre porque uma função chamada obtém seu próprio conjunto de parâmetros posicionais, independente do conjunto dos pais / responsável pela chamada. Experimentar
print_something "$1"
(e echo "$1", ou melhor ainda printf '%s\n' "$1", lembre-se de citar expansões de parâmetros e que echonão podem ser usadas para dados arbitrários).
$1geralmente é diferente do da função $1, embora PODE se tornar o mesmo se usado como proposto acima. Se eu te direita, o echopode permanecer o mesmo ( echo $1) quando a função é chamado com parâmetros individuais ( print_something $2leva US $ 1 e "marcas" do chamador-lo $1dentro da função)
echo $1não faz sentido, a menos que você queira $1ser tratado como uma lista delimitada por $ IFS de padrões de arquivos a serem expandidos. echo "$1"faria mais sentido, mas não produziria o conteúdo de $1para valores de $1like -nene, -EE...