toàn cầu / chia
Tôi sẽ lấy toàn cầu / chia trước. Câu trả lời của @ Stephane mà bạn liên kết đến là sử dụng các thuật ngữ đó theo nghĩa chung. Chúng không phải là các lệnh thực tế hoặc bất cứ thứ gì tương tự, chỉ là các thao tác giả.
Việc split("$test")
này sẽ chia nội dung của "$ test" thành một "mảng" các phần tử.
Sau glob(...)
đó, sẽ cẩn thận để mở rộng bất kỳ yếu tố nào trong số này có chứa các ký tự toàn cầu vỏ như *
hoặc phạm vi [1-2]
.
Thí dụ
Nói chuỗi của chúng tôi $test
là như sau.
$ test="afile[1-2] afile[3-5]"
Ngoài ra, hãy nói rằng chúng tôi có một thư mục với một số tệp trong đó.
$ ls -1
afile1
afile2
afile3
afile4
afile5
Bây giờ nếu chúng tôi cố gắng lặp lại nó mà không có dấu ngoặc kép, bạn sẽ nhận thấy rằng chuỗi của chúng tôi đã bị tách ra trên các khoảng trắng, và sau đó bất kỳ ký tự toàn cầu nào cũng được mở rộng.
$ echo $test
afile1 afile2 afile3 afile4 afile5
Tuy nhiên nếu chúng ta trích dẫn biến khi chúng ta chuyển nó làm đối số echo
thì chúng ta sẽ có được chuỗi ký tự gốc.
$ echo "$test"
afile[1-2] afile[3-5]
mở rộng biến
Thuật ngữ mở rộng biến có nghĩa là bao trùm hoạt động cơ bản mà shell đang thực hiện như là một phần của hoạt động cơ bản. Shell chịu trách nhiệm phân tích cú pháp đầu vào và sau đó thực hiện đầu vào này một khi nó được coi là đúng về mặt cú pháp.
Trong ví dụ trước của chúng tôi. Khi biến $test
được trình bày để không echo
trích dẫn, chúng tôi đã nói với trình bao đi trước và phân tách các đối số đó và sau đó đưa chúng vào.
Khi được trích dẫn, về cơ bản, chúng tôi đã vô hiệu hóa tính năng đó với (các) biến chúng tôi đã bao bọc bằng dấu ngoặc kép.
Thí dụ
Dưới đây là một số ví dụ bổ sung về việc tách và tách.
toàn cầu / chia tách xảy ra tự động
$ 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
toàn cầu / tách bị vô hiệu hóa thông qua trích dẫn kép
$ 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}