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.