Dlaczego nie echo $1drukuje $1w 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?
Dlaczego nie echo $1drukuje $1w 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?
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
print_something Something
wydrukowałby Something.
Jeśli chcesz przekazać argumenty skryptu do funkcji, musisz to zrobić jawnie. Posługiwać się
print_something "$1"
przekazać pierwszy argument, lub
print_something "$@"
aby przekazać je wszystkie, chociaż funkcja w przykładzie używa tylko pierwszej.
"$@"do print_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ć
print_something "$1"
(i echo "$1", a nawet lepiej printf '%s\n' "$1", pamiętaj o cytowaniu rozszerzeń parametrów, echoktórych nie można użyć do dowolnych danych).
$1róż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ę, echomoże pozostać niezmieniony ( echo $1), gdy funkcja jest wywoływana z pojedynczymi parametrami ( print_something $2bierze 1 wywołującego $ i „robi” go $1wewnątrz funkcji)
echo $1nie ma sensu, chyba że chcesz $1być 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 $1dla wartości $1podobnych -nene, -EE...