OnWorks Linux và Windows Online WorkStations

Logo

Lưu trữ trực tuyến miễn phí cho máy trạm

<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)

hình ảnh

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


hình ảnh

#! / 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


hình ảnh

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.


 

Điện toán đám mây hệ điều hành hàng đầu tại OnWorks: