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?
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?
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, echo
których nie można użyć do dowolnych danych).
$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
...