Ten post zawiera dwa osobne pytania, ale myślę, że zgrupowanie ich da więcej kontekstu. Przeszedłem przez to pytanie dotyczące cytatów wokół zmiennych, ale nie do końca rozumiem, co oznacza ekspansja zmiennych . Moje pierwsze pytanie brzmi:
- Czym jest zmienna ekspansja w systemach Unix / Linux?
Druga część mojego pytania dotyczy następujących terminów:
- glob
- rozdzielać
Co oznaczają powyższe i jak wpływają one na zmienną ekspansję? Odpowiedź na pierwotne pytanie wymienia następujące:
Pomyśl o braku cudzysłowów (w kontekście list) jako o operatorze split + glob.
Jakby test echa $ był globalnym echem (split („$ test”)).
Nie mogłem znaleźć odpowiedzi, które bezpośrednio dotyczą koncepcji globowania i dzielenia, ale raczej używam tych terminów bezpośrednio w odpowiedziach na inne pytania, takie jak to ostatnie .
Odpowiedzi:
Rozszerzanie zmiennych (standardowym terminem jest rozszerzanie parametrów , a czasem nazywane jest również podstawieniem zmiennych ) w zasadzie oznacza zastąpienie zmiennej jej wartością. Dokładniej, oznacza to zastąpienie
$VARIABLE
konstrukt (lub${VARIABLE}
lub${VARIABLE#TEXT}
lub inne konstrukty) za pośrednictwem innego tekstu, który jest zbudowany z wartości zmiennej. Ten drugi tekst jest rozwinięciem zmiennej.Proces ekspansji przebiega następująco. (Omawiam tylko typowy przypadek, niektóre ustawienia powłoki i rozszerzenia modyfikują zachowanie).
${VARIABLE#TEXT}
, a wartość zmiennej zaczyna się odTEXT
, usuńTEXT
z początku wartości.IFS
można zmienić tak, aby dzieliła się na znaki inne niż białe znaki). W rezultacie nie jest to już ciąg, ale lista ciągów. Ta lista może być pusta, jeśli wartość zawiera tylko białe znaki.Załóżmy na przykład, że zmienna
foo
zawieraa* b* c*
a bieżący katalog zawiera plikibar
,baz
apaz
. Następnie${foo#??}
jest rozwijany w następujący sposób:a* b* c*
.#??
oznacza usunięcie dwóch pierwszych znaków, co daje ciąg 6 znakówb* c*
(ze spacją początkową).b*
ic*
.b*
interpretowany jako wzór pasuje do dwóch plików:bar
ibaz
. Ciągc*
nie pasuje do żadnego pliku, więc jest pozostawiony samemu sobie. Rezultatem jest lista trzech ciągów:bar
,baz
,c*
.Na przykład
echo ${foo#??}
wypisujebar baz c*
(polecenieecho
łączy swoje argumenty ze spacją między nimi).Aby uzyskać więcej informacji, zobacz:
źródło
$var
) i innych typów parametrów, takich jak$1
,$#
,$?
,$-
...glob / split
Najpierw wezmę glob / split. @ Odpowiedź Stephane'a, do której linkujesz, używa tych terminów w ogólnym znaczeniu. Nie są to rzeczywiste polecenia ani nic w tym rodzaju, tylko pseudo operacje.
split("$test")
By podzielić zawartość „$ test” w górę „do tablicy” elementów.glob(...)
By następnie zająć się rozwijać każdy z tych elementów, które zawierają powłoki globbing znaki takie jak*
lub zakresy[1-2]
.Przykład
Powiedzmy, że nasz ciąg
$test
jest następujący.Powiedzmy też, że mamy katalog z niektórymi plikami.
Teraz, jeśli spróbujemy powtórzyć go bez cudzysłowów, powinieneś zauważyć, że nasz ciąg został podzielony na spacje, a następnie wszystkie globbingowe znaki zostały rozwinięte.
Gdybyśmy jednak zacytowali zmienną, gdy przekazaliśmy ją jako argument
echo
, otrzymalibyśmy oryginalny ciąg literału.zmienna ekspansja
Termin ekspansja zmiennej ma obejmować podstawową operację wykonywaną przez powłokę w ramach jej podstawowych operacji. Powłoka jest odpowiedzialna za parsowanie danych wejściowych, a następnie wykonanie tych danych wejściowych, gdy zostanie uznana za poprawną składniowo.
W naszym poprzednim przykładzie. Kiedy zmienna
$test
była prezentowana bezecho
cudzysłowu, mówiliśmy powłoce, aby poszła naprzód i podzieliła te argumenty, a następnie je zsumowała.Kiedy był cytowany, zasadniczo wyłączaliśmy tę funkcję za pomocą tego, co kiedykolwiek zmienne zawarliśmy podwójnymi cudzysłowami.
Przykład
Oto kilka dodatkowych przykładów globowania i podziału.
glob / dzielenie odbywa się automatycznie
glob / dzielenie wyłączone przez podwójne cytowanie
źródło