Dlaczego nie echo $1
drukuje $1
w tym prostym skrypcie bash?
#!/bin/bash
# function.sh
print_something () {
echo $1
}
print_something
$ ./function.sh 123 -> why doesn't it print '123' as a result?
bash
shell-script
function
pietro letti
źródło
źródło
Odpowiedzi:
Parametry pozycyjne odnoszą się do argumentów skryptu na głównym poziomie skryptu, ale do argumentów funkcji w treści funkcji. Więc
wydrukowałby
Something
.Jeśli chcesz przekazać argumenty skryptu do funkcji, musisz to zrobić jawnie. Posługiwać się
przekazać pierwszy argument, lub
aby przekazać je wszystkie, chociaż funkcja w przykładzie używa tylko pierwszej.
źródło
"$@"
doprint_something
, tak jak jest obecnie napisane, nadal jednak wypisuje tylko pierwszy argument."$*"
będzie pojedynczym ciągiem (połączonym z pierwszym znakiem$IFS
), a jednocześnie"$@"
listą pojedynczo cytowanych elementów."$@"
, nawet jeśli w tym przypadku jest tylko jeden taki parametr, ma obejmować wszystkie takie przypadki. Jeśli OP zdecyduje się dodać drugi parametr, nie ma nic do zmiany w wywołaniu funkcji. I wszyscy inni, którzy to przeczytają, nauczą się, jak to zrobić, aby uniknąć konieczności ponownego zrobienia tego później.Wynika to z faktu, że wywoływana funkcja otrzymuje własny zestaw parametrów pozycyjnych, niezależny od zestawu rodzica / dzwoniącego. Próbować
(i
echo "$1"
, a nawet lepiejprintf '%s\n' "$1"
, pamiętaj o cytowaniu rozszerzeń parametrów,echo
których nie można użyć do dowolnych danych).źródło
$1
różni się zasadniczo od funkcji$1
, chociaż MOŻE stać się taki sam, jeśli zostanie użyty zgodnie z powyższym opisem. Jeśli mam rację,echo
może pozostać niezmieniony (echo $1
), gdy funkcja jest wywoływana z pojedynczymi parametrami (print_something $2
bierze 1 wywołującego $ i „robi” go$1
wewnątrz funkcji)echo $1
nie ma sensu, chyba że chcesz$1
być traktowany jako lista wzorców plików rozdzielana $ IFS do rozwinięcia.echo "$1"
miałoby więcej sensu, ale nie wyświetliłoby treści$1
dla wartości$1
podobnych-nene
,-EE
...