<Trước | Nội dung | Tiếp theo>
Nhóm lệnh và bảng con
bash cho phép các lệnh được nhóm lại với nhau. Điều này có thể được thực hiện theo một trong hai cách; ei- ther với một lệnh nhóm hoặc với một vỏ nhỏ. Dưới đây là các ví dụ về cú pháp của từng loại:
Lệnh nhóm:
{lệnh1; lệnh2; [lệnh3; ...]}
Tóm tắt:
(command1; command2; [command3; ...])
Hai hình thức khác nhau ở chỗ một lệnh nhóm bao quanh các lệnh của nó bằng dấu ngoặc nhọn và một vỏ con sử dụng dấu ngoặc đơn. Điều quan trọng cần lưu ý là, do cách bash thực hiện các lệnh nhóm, các dấu ngoặc nhọn phải được ngăn cách với các lệnh bằng một khoảng trắng và lệnh cuối cùng phải được kết thúc bằng dấu chấm phẩy hoặc một dòng mới trước dấu ngoặc nhọn.
Vì vậy, nhóm lệnh và biểu mẫu con tốt cho điều gì? Mặc dù chúng có sự khác biệt quan trọng (mà chúng ta sẽ tìm hiểu trong giây lát), chúng đều được sử dụng để quản lý chuyển hướng. Hãy xem xét một đoạn script thực hiện chuyển hướng trên nhiều lệnh:
ls -l> output.txt
echo "Danh sách foo.txt" >> output.txt cat foo.txt >> output.txt
ls -l> output.txt
echo "Danh sách foo.txt" >> output.txt cat foo.txt >> output.txt
Việc này thật thẳng thắn. Ba lệnh với đầu ra của chúng được chuyển hướng đến một tệp có tên đầu ra.txt. Sử dụng lệnh nhóm, chúng ta có thể viết mã này như sau:
{ls -l; echo "Danh sách foo.txt"; mèo foo.txt; }> output.txt
{ls -l; echo "Danh sách foo.txt"; mèo foo.txt; }> output.txt
Sử dụng một vỏ con cũng tương tự:
(ls -l; echo "Danh sách foo.txt"; cat foo.txt)> output.txt
(ls -l; echo "Danh sách foo.txt"; cat foo.txt)> output.txt
Sử dụng kỹ thuật này, chúng tôi đã tiết kiệm cho mình một số thao tác gõ, nhưng nơi mà một lệnh nhóm hoặc vỏ con thực sự tỏa sáng là với các đường ống. Khi xây dựng một đường dẫn lệnh, thường hữu ích khi kết hợp các kết quả của một số lệnh thành một luồng duy nhất. Nhóm lệnh và biểu mẫu con giúp việc này trở nên dễ dàng:
{ls -l; echo "Danh sách foo.txt"; mèo foo.txt; } | lpr
{ls -l; echo "Danh sách foo.txt"; mèo foo.txt; } | lpr
Ở đây, chúng tôi đã kết hợp đầu ra của ba lệnh của chúng tôi và đưa chúng vào đầu vào của lpr để tạo ra một báo cáo in.
Trong tập lệnh tiếp theo, chúng ta sẽ sử dụng các lệnh nhóm và xem xét một số kỹ thuật lập trình có thể được sử dụng cùng với các mảng kết hợp. Tập lệnh này, được gọi là mảng-2, khi được cung cấp tên của một thư mục, in danh sách các tệp trong thư mục cùng với tên của chủ sở hữu tệp và chủ sở hữu nhóm. Vào cuối danh sách, tập lệnh in ra bảng kiểm đếm số lượng tệp thuộc về từng chủ sở hữu và nhóm. Ở đây chúng tôi thấy kết quả (cô đọng cho ngắn gọn) khi tập lệnh được cung cấp thư mục
/ usr / bin:
[tôi @ linuxbox ~] $ array-2 / usr / bin | ||
/usr/bin/2to3-2.6 | nguồn gốc | nguồn gốc |
/ usr / bin / 2to3 | nguồn gốc | nguồn gốc |
/ usr / bin / a2p | nguồn gốc | nguồn gốc |
/ usr / bin / abrowser | nguồn gốc | nguồn gốc |
/ usr / bin / aconnect | nguồn gốc | nguồn gốc |
/ usr / bin / acpi_fakekey | nguồn gốc | nguồn gốc |
/ usr / bin / acpi_listen | nguồn gốc | nguồn gốc |
/ usr / bin / add-apt-repository | nguồn gốc | nguồn gốc |
. | ||
. | ||
. | ||
/ usr / bin / zipgrep | nguồn gốc | nguồn gốc |
/ usr / bin / zipinfo | nguồn gốc | nguồn gốc |
/ usr / bin / zipnote | nguồn gốc | nguồn gốc |
/ usr / bin / zip | nguồn gốc | nguồn gốc |
/ usr / bin / zipsplit / usr / bin / zjsdecode / usr / bin / zsoelim | rễ gốc rễ | rễ gốc rễ | |
Chủ sở hữu tệp: daemon: 1 | các tập tin) | ||
gốc: 1394 | các tập tin) |
Chủ sở hữu nhóm tệp: crontab: 1 tệp daemon: 1 (các) tệp lpadmin: 1 (các) tệp mail: 4 (các) tệp mlocate: 1 tệp root: 1380 tệp shadow: 2 tệp (s) ssh: 1 tệp
tty: 2 tệp
utmp: 2 tệp
#! / bin / bash
#! / bin / bash
# array-2: Sử dụng mảng để kiểm đếm chủ sở hữu tệp
khai báo -A files file_group file_owner nhóm chủ sở hữu nếu [[! -d "$ 1"]]; sau đó
echo "Cách sử dụng: array-2 dir"> & 2 exit 1
fi
cho tôi trong "$ 1" / *; do owner = $ (stat -c% U "$ i") group = $ (stat -c% G "$ i") files ["$ i"] = "$ i" file_owner ["$ i"] = $ owner file_group ["$ i"] = $ group ((++ owner [$ owner])) ((++ nhóm [$ group]))
thực hiện
# Liệt kê các tệp đã thu thập
{cho tôi trong "$ {files [@]}"; thực hiện printf "% -40s% -10s% -10s \ n" \
"$ i" $ {file_owner ["$ i"]} $ {file_group ["$ i"]} xong} | loại
# array-2: Sử dụng mảng để kiểm đếm chủ sở hữu tệp
khai báo -A files file_group file_owner nhóm chủ sở hữu nếu [[! -d "$ 1"]]; sau đó
echo "Cách sử dụng: array-2 dir"> & 2 exit 1
fi
cho tôi trong "$ 1" / *; do owner = $ (stat -c% U "$ i") group = $ (stat -c% G "$ i") files ["$ i"] = "$ i" file_owner ["$ i"] = $ owner file_group ["$ i"] = $ group ((++ owner [$ owner])) ((++ nhóm [$ group]))
thực hiện
# Liệt kê các tệp đã thu thập
{cho tôi trong "$ {files [@]}"; thực hiện printf "% -40s% -10s% -10s \ n" \
"$ i" $ {file_owner ["$ i"]} $ {file_group ["$ i"]} xong} | loại
Đây là danh sách (với số dòng) của tập lệnh:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
27
28
29
30
31
32
33
34
35
36
37
38
39
40
bỏ lỡ
bỏ lỡ
# Chủ sở hữu danh sách
echo "Chủ sở hữu tệp:"
{cho tôi trong "$ {! owner [@]}"; làm
printf "% -10s:% 5d file \ n" "$ i" $ {owner ["$ i"]} done} | loại
bỏ lỡ
# Liệt kê các nhóm
echo "Chủ sở hữu nhóm tệp:"
{cho tôi trong "$ {! groups [@]}"; làm
printf "% -10s:% 5d file \ n" "$ i" $ {groups ["$ i"]} done} | loại
# Chủ sở hữu danh sách
echo "Chủ sở hữu tệp:"
{cho tôi trong "$ {! owner [@]}"; làm
printf "% -10s:% 5d file \ n" "$ i" $ {owner ["$ i"]} done} | loại
bỏ lỡ
# Liệt kê các nhóm
echo "Chủ sở hữu nhóm tệp:"
{cho tôi trong "$ {! groups [@]}"; làm
printf "% -10s:% 5d file \ n" "$ i" $ {groups ["$ i"]} done} | loại
Chúng ta hãy xem xét cơ chế của tập lệnh này:
Dòng 5: Mảng liên kết phải được tạo bằng khai lệnh sử dụng -A
Lựa chọn. Trong tập lệnh này, chúng tôi tạo năm mảng như sau:
tệp chứa tên của tệp trong thư mục, được lập chỉ mục bởi tên tệp chứa chủ sở hữu nhóm của mỗi tệp, được lập chỉ mục bởi tên tệp chứa chủ sở hữu của mỗi tệp, được lập chỉ mục theo nhóm tên tệp chứa số tệp thuộc chủ sở hữu nhóm được lập chỉ mục chứa số lượng tệp thuộc về chủ sở hữu được lập chỉ mục
Dòng 7-10: Kiểm tra xem tên thư mục hợp lệ đã được chuyển dưới dạng tham số vị trí hay chưa. Nếu không, thông báo sử dụng được hiển thị và tập lệnh thoát với trạng thái thoát là 1.
Dòng 12-20: Lặp lại các tệp trong thư mục. Sử dụng stat lệnh, dòng 13 và 14 trích xuất tên của chủ sở hữu tệp và chủ sở hữu nhóm và gán giá trị cho các mảng tương ứng của họ (dòng 16, 17) bằng cách sử dụng tên của tệp làm chỉ số mảng. Tương tự như vậy, chính tên tệp được gán cho các tập tin mảng (dòng 15).
Dòng 18-19: Tổng số tệp thuộc chủ sở hữu tệp và chủ sở hữu nhóm được tăng lên một.
Dòng 22-27: Danh sách các tập tin được xuất ra. Điều này được thực hiện bằng cách sử dụng phần mở rộng tham số "$ {array [@]}" mở rộng thành toàn bộ danh sách các phần tử mảng với mỗi phần tử được coi là một từ riêng biệt. Điều này cho phép khả năng tên tệp có thể chứa không gian nhúng. Cũng lưu ý rằng toàn bộ vòng lặp được bao bọc trong dấu ngoặc nhọn, do đó tạo thành một nhóm. Điều này cho phép toàn bộ đầu ra của vòng lặp được đưa vào loại chỉ huy. Điều này là cần thiết vì sự mở rộng của các phần tử mảng không được sắp xếp.
Dòng 29-40: Hai vòng lặp này tương tự như vòng lặp danh sách tệp ngoại trừ việc chúng sử dụng "$ {!
mảng [@]} "phần mở rộng mở rộng thành danh sách các chỉ mục mảng thay vì danh sách các phần tử của mảng.
<Trước | Nội dung | Tiếp theo>