Perché $ 1 in una funzione non stampa il primo argomento dello script?


13

Perché non echo $1stampare $1in questo semplice script bash?

#!/bin/bash
# function.sh
print_something () {
echo $1
}
print_something

$ ./function.sh 123  -> why doesn't it print '123' as a result?

6
perché hai dimenticato $ 1 quando hai chiamato print_something. Prova a includere il testo nella domanda e non nel titolo.
Rui F Ribeiro,

Grazie. Quale dovrebbe essere l'argomento eco se devo inserire nello script i comandi: print_something "$ 1"; print_something "$ 2"; e forse di più?
pietro letti,

13
Quando l'ho visto in HNQ ho pensato che stavi stampando banconote da un dollaro e speravo di leggere alcune storie succose su come la tua stampante rileva che stai stampando denaro falso.
pipe,

@pipe L'ho già accaduto prima, per qualche motivo si rifiuta di stampare qualsiasi cosa non solo quelle con le prevenzione anti-stampa.
Codingale,

Risposte:


41

I parametri posizionali si riferiscono agli argomenti dello script nel livello principale dello script, ma agli argomenti delle funzioni nel corpo della funzione. Così

print_something Something

sarebbe effettivamente stampare Something.

Se si desidera passare gli argomenti dello script a una funzione, è necessario farlo esplicitamente. Uso

print_something "$1"

per passare il primo argomento, oppure

print_something "$@"

per passarli tutti, sebbene la funzione nell'esempio usi solo il primo.


1
Passare "$@"a print_something, come è attualmente scritto, stamperebbe comunque solo il primo degli argomenti.
Kusalananda

13
Ma il punto era mostrare come superare tutti gli argomenti, presumo. Il fatto che la funzione, così com'è, utilizza solo il primo dei suoi argomenti è un po 'irrilevante.
weirdan,

Bene, solo pensando che non ha senso passare tutti gli argomenti se si usa solo il primo.
Kusalananda

14
@allo No. "$*"sarebbe una singola stringa (unita al primo carattere di $IFS) mentre "$@"sarebbe un elenco di elementi quotati singolarmente.
Kusalananda

5
@Kusalananda il punto di dire a qualcuno che vuole passare i parametri della riga di comando a una funzione da usare "$@", anche se in questo caso esiste solo uno di questi parametri, è quello di coprire tutti questi casi. Se l'OP decide di aggiungere un secondo parametro, non c'è nulla da cambiare nell'invocazione della funzione. E tutti gli altri che leggeranno questo impareranno il modo giusto di farlo per evitare di doverlo rifare in seguito.
Monty Harder,

10

Questo perché una funzione chiamata ottiene il proprio set di parametri posizionali, indipendentemente dal set del genitore / chiamante. Provare

print_something "$1"

(e echo "$1", o meglio printf '%s\n' "$1", ricordati di citare le espansioni dei parametri e che echonon possono essere utilizzate per dati arbitrari).


Devi diventare più chiaro di cosa stai parlando. Il chiamante $1è generalmente diverso da quello della funzione $1, sebbene PUOI diventare lo stesso se usato come proposto sopra. Se ti capisco bene, echopuò rimanere lo stesso ( echo $1) quando la funzione viene chiamata con parametri singoli ( print_something $2prende $ 1 del chiamante e "lo fa" $1all'interno della funzione)
RudiC

6
L'uso echo $1non ha senso a meno che tu non voglia $1essere trattato come un elenco delimitato da $ IFS di modelli di file da espandere. echo "$1"avrebbe più senso, anche se non produrrebbe il contenuto di $1valori $1simili -nene, -EE...
Stéphane Chazelas,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.