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.
$ test="afile[1-2] afile[3-5]"
Powiedzmy też, że mamy katalog z niektórymi plikami.
$ ls -1
afile1
afile2
afile3
afile4
afile5
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.
$ echo $test
afile1 afile2 afile3 afile4 afile5
Gdybyśmy jednak zacytowali zmienną, gdy przekazaliśmy ją jako argument echo
, otrzymalibyśmy oryginalny ciąg literału.
$ echo "$test"
afile[1-2] afile[3-5]
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 bez echo
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
$ echo file{1..3}
file1 file2 file3
$ echo file{1..3} dir{a..b}
file1 file2 file3 dira dirb
$ echo dir{z..w} file{A..D}
dirz diry dirx dirw fileA fileB fileC fileD
$ echo dir{z..w} file{A..B} fileC
dirz diry dirx dirw fileA fileB fileC
glob / dzielenie wyłączone przez podwójne cytowanie
$ echo "dir{z..w} file{A..B} fileC"
dir{z..w} file{A..B} fileC
$ echo "dir{z..w} file{A..B}"
dir{z..w} file{A..B}