$ echo $(date)
Thu Jul 2 16:33:11 SGT 2015
$ echo ${date}
$ name=foo
$ echo $(name)
ksh: name: not found
$ echo ${name}
foo
Wygląda na to, że $ {zmienna} jest taka sama jak $ zmienna. podczas gdy $ () ma wykonać polecenie. Po co więc korzystać z $ {}?
${
variable_name
}
Odpowiedzi:
$(command)
to „podstawienie polecenia”. Jak się wydaje, rozumiesz, uruchamia oncommand
, przechwytuje dane wyjściowe i wstawia je do wiersza poleceń zawierającego$(…)
; na przykład,${parameter}
to „podstawienie parametru”. Wiele informacji można znaleźć na stronie man powłoki, bash (1) , pod nagłówkiem „ Parameter Expansion ”:Aby zapoznać się z parametrami pozycyjnymi, patrz „ Parametry pozycyjne ” poniżej. W najczęstszym użyciu, jak pokazano w innych odpowiedziach,
parameter
jest nazwa zmiennej.${…}
Forma, jak podano na końcu ustępie powyżej, pozwala uzyskać wartość zmiennej (tj ), a następnie ją natychmiast z literą, cyfrą lub podkreślenia:$variable_name
Możesz to również zrobić za pomocą cytatów:
Lub, jako ćwiczenie opcji, możesz użyć drugiej zmiennej:
Ale to tylko krok 1. Następny akapit na stronie podręcznika jest interesujący, choć trochę tajemniczy:
Nie jestem pewien, jak mogę to wyjaśnić inaczej niż na przykładzie:
Nazwijmy więc ten krok 1½. Istnieje wiele ciekawych rzeczy, które możesz zrobić jako krok 2:
Nie możesz zrobić żadnej z tych rzeczy bez
{
…}
aparatów ortodontycznych.Parametry pozycyjne
Rozważ ten sztuczny przykład:
ponieważ powłoka nie rozumie
$10
,$11
itp Traktuje$10
jakby to było${1}0
. Ale to nie rozumie${10}
,${11}
itp, jak wspomniano na stronie man ( „A parametru pozycyjnego z więcej niż jedną cyfrę”).Powyższe (wraz z wieloma innymi formami konstrukcji) są omówione bardziej szczegółowo na stronie podręcznika powłoki, bash (1) .
${parameter…something_else}
Uwaga na cytaty
Pamiętaj, że zawsze powinieneś cytować zmienne powłoki, chyba że masz dobry powód, aby tego nie robić , i jesteś pewien, że wiesz, co robisz. Natomiast nawiasy klamrowe mogą być ważne, ale nie są tak ważne jak cytaty.
Dotyczy to również parametrów pozycyjnych (tj. Argumentów wiersza poleceń; np.
"$1"
), A także podstawiania poleceń:Zobacz Bash cytaty Niecytowany od podstawienia polecenia na krótki traktat na temat interakcji pomiędzy cytatów i
$(
...)
.źródło
!
.${!animal}
rzeczywistości odnosi się do zmiennej$cat
zamiast wartości cat.” Tak, właśnie o to chodzi. „Jak / at staje się„ c ”w echu $ {animal / at / ow}?” Huh? / at nie staje się „c”; „Kot” staje się „krową”, gdy „at” jest zastąpione przez „ow”.W twoim przykładzie $ var i $ {var} są identyczne. Jednak nawiasy klamrowe są przydatne, gdy chcesz rozwinąć zmienną w ciągu:
W ten sposób nawiasy klamrowe umożliwiają zastąpienie zmiennej w celu uzyskania nazwy nowej zmiennej, która ma zostać zastąpiona.
źródło
Zwykle widzę to częściej w ciągach. Coś takiego nie będzie działać:
Ale to:
Jak poprawnie powiedziałeś,
$()
służy do wykonania polecenia:Możesz także użyć backticksa, ale uważam, że jest
$()
bardziej uniwersalny. Po pierwsze, backticks nie mogą być (łatwo) zagnieżdżone.źródło
date_directory=`ls \`date '+%Y-%m-%d'\``
. Ale to jest strasznie brzydkie;$(…)
jest znacznie jaśniejszy i łatwiejszy w użyciu.`…`
był (tylko) składnia podstawiania poleceń lat zanim wynaleziono, więc nie trzeba wyobrazić sobie cokolwiek - ludzie to zrobił.$(…)