Dlaczego 1 $ w funkcji nie wypisuje pierwszego argumentu skryptu?

13

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?
pietro letti
źródło
6
ponieważ zapomniałeś 1 $ podczas wywoływania print_something. Spróbuj dołączyć tekst do pytania, a nie do tytułu.
Rui F Ribeiro
dzięki. Jaki powinien być argument echa, jeśli muszę wstawić do skryptu polecenia: print_something "$ 1"; print_something "$ 2"; a może więcej?
pietro letti
13
Kiedy zobaczyłem to w HNQ, pomyślałem, że drukujesz banknoty i miałem nadzieję przeczytać soczystą historię o tym, jak twoja drukarka wykrywa, że ​​drukujesz fałszywe pieniądze.
rura
@pipe Zdarzyło mi się to wcześniej, z jakiegoś powodu odmawia drukowania czegokolwiek, nie tylko tych z zabezpieczeniami zapobiegającymi drukowaniu.
Codingale

Odpowiedzi:

41

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.

dziwak
źródło
1
Przekazywanie "$@"do print_something, tak jak jest obecnie napisane, nadal jednak wypisuje tylko pierwszy argument.
Kusalananda
13
Chodzi mi jednak o to, by pokazać, jak przekazać wszystkie argumenty. Fakt, że funkcja, w jej obecnym kształcie, wykorzystuje tylko pierwszy ze swoich argumentów, jest nieco nieistotny.
weirdan
Cóż, myślenie, że nie ma sensu przekazywać wszystkich argumentów, jeśli tylko pierwszy z nich jest używany.
Kusalananda
14
@allo No. "$*"będzie pojedynczym ciągiem (połączonym z pierwszym znakiem $IFS), a jednocześnie "$@"listą pojedynczo cytowanych elementów.
Kusalananda
5
@Kusalananda celem powiedzenia komuś, kto chce przekazać parametry wiersza polecenia do funkcji, która ma być użyta "$@", 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.
Monty Harder
10

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).

RudiC
źródło
Musisz wyjaśnić, o czym mówisz. Program wywołujący $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)
RudiC
6
Używanie 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...
Stéphane Chazelas