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?

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.


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


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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.