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?
bash
shell-script
function
Pietro Letti
fonte
fonte
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
realmente imprimiria
Something
.Se você deseja passar os argumentos do script para uma função, faça isso explicitamente. Usar
para passar o primeiro argumento, ou
para passar todos eles, embora a função no exemplo use apenas o primeiro.
fonte
"$@"
paraprint_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
(e
echo "$1"
, ou melhor aindaprintf '%s\n' "$1"
, lembre-se de citar expansões de parâmetros e queecho
não podem ser usadas para dados arbitrários).fonte
$1
geralmente é diferente do da função$1
, embora PODE se tornar o mesmo se usado como proposto acima. Se eu te direita, oecho
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
...