Perché non echo $1
stampare $1
in 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?
Perché non echo $1
stampare $1
in 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?
Risposte:
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.
"$@"
a print_something
, come è attualmente scritto, stamperebbe comunque solo il primo degli argomenti.
"$*"
sarebbe una singola stringa (unita al primo carattere di $IFS
) mentre "$@"
sarebbe un elenco di elementi quotati singolarmente.
"$@"
, 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.
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 echo
non possono essere utilizzate per dati arbitrari).
$1
è generalmente diverso da quello della funzione $1
, sebbene PUOI diventare lo stesso se usato come proposto sopra. Se ti capisco bene, echo
può rimanere lo stesso ( echo $1
) quando la funzione viene chiamata con parametri singoli ( print_something $2
prende $ 1 del chiamante e "lo fa" $1
all'interno della funzione)
echo $1
non ha senso a meno che tu non voglia $1
essere 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 $1
valori $1
simili -nene
, -EE
...