Por que $ 1 em uma função não está imprimindo o primeiro argumento do script?

13

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?
Pietro Letti
fonte
6
porque você esqueceu o $ 1 ao chamar print_something. Por favor, tente incluir texto na pergunta e não no título.
Rui F Ribeiro
obrigado. Qual deve ser o argumento echo se eu precisar inserir no script os comandos: print_something "$ 1"; print_something "$ 2"; e talvez mais?
Pietro letti 27/08/18
13
Quando vi isso no HNQ, pensei que você estava imprimindo notas de dólar e esperava ler uma história interessante sobre como sua impressora detecta que está imprimindo dinheiro falso.
pipe
@pipe Já tive isso comigo antes, por algum motivo, ele se recusa a imprimir qualquer coisa, não apenas as que contêm as prevenções anti-impressão.
Codingale 27/08/18

Respostas:

41

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.

weirdan
fonte
1
Passar "$@"para print_something, como está escrito atualmente, ainda imprimiria apenas o primeiro dos argumentos.
Kusalananda
13
Mas o objetivo era mostrar como passar todos os argumentos, presumo. O fato de a função, como está, apenas usar o primeiro de seus argumentos é um pouco irrelevante.
Weirdan 27/08/19
Bem, apenas pensando que não há sentido em passar todos os argumentos se apenas o primeiro estiver sendo usado.
Kusalananda
14
@allo No. "$*"seria uma única string (unida no primeiro caractere de $IFS) enquanto "$@"haveria uma lista de elementos entre aspas individuais.
Kusalananda
5
@Kusalananda O objetivo de dizer a alguém que deseja passar os parâmetros da linha de comando para uma função a ser usada "$@", 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.
Monty Harder
10

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).

RudiC
fonte
Você precisa ficar mais claro do que está falando. O chamador $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)
Rudic
6
O uso 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...
Stéphane Chazelas