Mam następującą funkcję:
bar() { echo $1:$2; }
Wołam tę funkcję z innej funkcji foo
. foo
sam nazywa się w następujący sposób:
foo "This is" a test
Chcę uzyskać następujące dane wyjściowe:
This is:a
Oznacza to, że bar
otrzymywane argumenty powinny być tymi samymi tokenami, które przekazuję foo
.
Jak foo
należy to zrealizować? Próbowałem następujących dwóch implementacji, ale żadna nie działa:
foo() { bar $*; }
- wynik:
this:is
foo() { bar "$*"; }
- wynik:
this is a test:
Moje pytanie brzmi, w jaki sposób mogę zachować cytowanie argumentów. Czy to w ogóle jest możliwe?
Odpowiedzi:
Użyj
"$@"
:"$@"
i"$*"
mają specjalne znaczenie:"$@"
rozwija się do wielu słów bez wykonywania rozszerzeń dla słów (jak"$1" "$2" ...
)."$*"
łączy parametry pozycyjne z pierwszym znakiem w IFS (lub spacją, jeśli IFS jest rozbrojony lub nic, jeśli IFS jest pusty).źródło
$*
to miało semantyczne - teraz jest logiczne. Myślę, że ta odpowiedź faktycznie rozwiązuje inny problem, który miałem podczas iteracji po tablicach…Musisz użyć
$@
zamiast$*
wyjście
Dlaczego to działa?
Ponieważ z
$*
, cały parametr jest postrzegany jako pojedyncze słowo , oznacza to, że przejdzieszThis is a test
dobar
funkcji. W tym przypadku pierwszy parametr przekazywany do paska funkcji toThis
, drugi tois
.Z
$@
każdym parametrem jest ciąg cytowany , co oznacza, że przejdziesz'This is'
'a'
'test'
dobar
funkcji. Zatem pierwszy parametr przekazywany do paska funkcji toThis is
, drugi toa
.źródło