Por que não echo $1
imprime $1
neste 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 $1
imprime $1
neste 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 echo
não podem ser usadas para dados arbitrários).
$1
geralmente é diferente do da função $1
, embora PODE se tornar o mesmo se usado como proposto acima. Se eu te direita, o echo
pode permanecer o mesmo ( echo $1
) quando a função é chamado com parâmetros individuais ( print_something $2
leva US $ 1 e "marcas" do chamador-lo $1
dentro da função)
echo $1
não faz sentido, a menos que você queira $1
ser 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 $1
para valores de $1
like -nene
, -EE
...