Mọi thứ bạn cần biết về Bash For Loops trong Linux

Mọi thứ bạn cần biết về Bash For Loops trong Linux

Các tập lệnh Bash là một phương tiện hiệu quả cao để tự động hóa các tác vụ, đặc biệt là những công việc tận dụng các chương trình hiện có khác. Tự động hóa này thường yêu cầu lặp lại một hoạt động tương tự nhiều lần, đó chính là nơi vòng lặp for đi vào của riêng nó.





Các quản trị viên hệ thống Linux và Mac thường quen thuộc với việc viết tập lệnh qua thiết bị đầu cuối, nhưng ngay cả người dùng Windows cũng có thể tham gia vào hành động với Hệ thống con Windows dành cho Linux .





Cách hoạt động của Bash Scripts

Tập lệnh bash chỉ đơn giản là một tệp văn bản thuần túy chứa một loạt lệnh mà bash shell có thể đọc và thực thi. Bash là trình bao mặc định trong macOS trước Catalina và hầu hết các bản phân phối Linux.





Nếu bạn chưa từng làm việc với shell script trước đây, bạn nên bắt đầu với trường hợp đơn giản nhất. Điều này sẽ cho phép bạn thực hành các khái niệm chính bao gồm việc tạo tập lệnh và thực thi nó.

Trước tiên, hãy tạo tệp sau ở một vị trí thuận tiện (lý tưởng là mở một thiết bị đầu cuối và điều hướng đến thư mục mong muốn trước):



#!/bin/bash
echo 'Hello, World'

Dòng đầu tiên cho biết bất cứ điều gì chạy chương trình này cách chạy nó (tức là sử dụng trình thông dịch bash). Thứ hai chỉ là một lệnh giống như bất kỳ lệnh nào khác mà bạn có thể nhập trên dòng lệnh. Lưu tệp đó thành hello_world.sh , sau đó:

$ chmod +x hello_world.sh
$ ./hello_world.sh

Các chmod lệnh trên dòng đầu tiên làm cho tệp có thể thực thi được, nghĩa là nó có thể được chạy bằng cách nhập tên của nó, như trong dòng thứ hai.





Nếu bạn thấy các từ Xin chào, Thế giới xuất hiện trên một dòng trong thiết bị đầu cuối của mình thì mọi thứ đang hoạt động như yêu cầu.

Làm thế nào cho các vòng lặp hoạt động

Trong lập trình nói chung, có hai loại vòng lặp for chính: sốcho mỗi . Loại số theo truyền thống là loại phổ biến nhất, nhưng trong cách sử dụng bash, nó thường theo cách khác.





Số cho vòng lặp thường tập trung vào một số nguyên duy nhất xác định số lần lặp sẽ được thực hiện, ví dụ:

for (i = 0; i <100; i++) {
/* statements to execute repeatedly */
}

Đây là một vòng lặp tìm kiếm quen thuộc sẽ lặp lại chính xác 100 lần, trừ khi tôi bị thay đổi trong vòng lặp hoặc một câu lệnh khác khiến việc thực thi vòng lặp for bị tạm dừng.

Ngược lại, vòng lặp Foreach có xu hướng hoạt động trên các cấu trúc như danh sách hoặc mảng và lặp lại cho mọi mục trong bộ sưu tập đó:

people = [ 'Peter', 'Paul', 'Mary' ]
foreach (people as person) {
if (person == 'Paul') {
...
}
}

Một số ngôn ngữ sử dụng cú pháp hơi khác để hoán đổi thứ tự của bộ sưu tập và mặt hàng:

people = [ 'Peter', 'Paul', 'Mary' ]
for (person in people) {
if (person == 'Paul') {
...
}
}

Đối với trong các vòng lặp

Trong bash, foreach — hoặc tại —Loop phổ biến hơn. Cú pháp cơ bản, đơn giản là:

for arg in [list]
do
/* statements to execute repeatedly */
/* the value of arg can be obtained using $arg */
done

Ví dụ: để lặp qua ba tệp được đặt tên rõ ràng:

mã dừng: ngoại lệ luồng hệ thống không được xử lý
for file in one.c two.c three.c
do
ls '$file'
done

Nếu các tệp như vậy tồn tại trong thư mục hiện tại, đầu ra từ tập lệnh này sẽ là:

one.c
two.c
three.c

Thay vì một tập hợp các tệp cố định, danh sách có thể được lấy thông qua một mẫu hình cầu (một mẫu bao gồm các ký tự đại diện - các ký tự đặc biệt đại diện cho các ký tự khác). Trong ví dụ sau, vòng lặp for lặp lại trên tất cả các tệp (trong thư mục hiện tại) có tên kết thúc bằng '.xml':

for file in *.xml
do
ls -l '$file'
done

Dưới đây là một số kết quả mẫu:

$ -rw-r--r-- 1 bobby staff 2436 3 Nov 2019 feed.xml
$ -rw-r--r-- 1 bobby staff 6447 27 Oct 16:24 sitemap.xml

Điều này có thể trông rất giống một cách làm dài dòng:

$ ls -l *.xml

Nhưng có một sự khác biệt đáng kể: vòng lặp for thực thi ls chương trình 2 lần riêng biệt, với một tên tệp duy nhất được chuyển cho nó mỗi lần. Trong ví dụ ls riêng biệt, mẫu hình cầu (* .xml) khớp với tên tệp trước và sau đó gửi tất cả chúng, dưới dạng các tham số dòng lệnh riêng lẻ, đến một phiên bản của ls .

Dưới đây là một ví dụ sử dụng wc (đếm từ) chương trình để làm cho sự khác biệt rõ ràng hơn:

$ wc -l *.xml
44 feed.xml
231 sitemap.xml
275 total

Các wc chương trình đếm số dòng trong mỗi tệp riêng biệt, sau đó in ra tổng số trên tất cả chúng. Ngược lại, nếu wc hoạt động trong vòng lặp for:

for file in *.xml
do
wc -l $file
done

Bạn sẽ vẫn thấy số lượng cho mỗi tệp:

44 feed.xml
231 sitemap.xml

Nhưng không có tổng số tóm tắt chung bởi vì wc được chạy một cách cô lập, mỗi khi vòng lặp lặp lại.

Khi một danh sách không phải là một danh sách

Có một lỗi rất dễ gặp và phổ biến khi xử lý vòng lặp for, do cách bash xử lý các đối số / chuỗi được trích dẫn. Việc lặp qua danh sách các tệp sẽ được thực hiện như sau:

for file in one.c two.c

Không phải như thế này:

for file in 'one.c two.c'

Ví dụ thứ hai đặt tên tệp trong dấu ngoặc kép dẫn đến danh sách chỉ có một tham số duy nhất; vòng lặp for sẽ chỉ thực hiện một lần. Có thể tránh được vấn đề này bằng cách sử dụng một biến trong những trường hợp như vậy:

FILES='one.c two.c'
for file in $FILES
do
...
done

Lưu ý rằng bản thân khai báo biến cần phải đặt giá trị của nó trong dấu ngoặc kép!

cách di chuyển tệp từ máy tính này sang máy tính khác

Vì không có danh sách

Không có gì để lặp lại, vòng lặp for hoạt động trên bất kỳ đối số dòng lệnh nào được cung cấp cho tập lệnh khi được gọi. Ví dụ: nếu bạn có một tập lệnh có tên args.sh chứa những thứ sau:

#!/bin/sh
for a
do
echo $a
done

Sau đó, thực thi args.sh sẽ cung cấp cho bạn những điều sau:

$ ./args.sh one two three
one
two
three

Bash nhận ra trường hợp này và xử lý để làm tương đương với với $ @ do trong đó $ @ là một biến đặc biệt đại diện cho các đối số dòng lệnh.

Mô phỏng một số truyền thống cho vòng lặp

Các tập lệnh Bash thường xử lý danh sách các tệp hoặc các dòng đầu ra từ các lệnh khác, do đó, loại vòng lặp for in là phổ biến. Tuy nhiên, hoạt động kiểu c truyền thống vẫn được hỗ trợ:

for (( i=1; i<=5; i++ ))
do
echo $i
done

Đây là hình thức cổ điển với ba phần, trong đó:

  1. một biến được khởi tạo (i = 1) khi lần đầu tiên gặp vòng lặp
  2. vòng lặp tiếp tục miễn là điều kiện (tôi<=5) is true
  3. mỗi lần xung quanh vòng lặp, biến được tăng lên (i ++)

Lặp lại giữa hai giá trị là một yêu cầu đủ phổ biến để có một giải pháp thay thế ngắn hơn, ít nhầm lẫn hơn một chút:

for i in {1..5}
do
echo $i
done

Việc mở rộng dấu ngoặc nhọn diễn ra hiệu quả sẽ chuyển vòng lặp for ở trên thành:

for i in 1 2 3 4

Kiểm soát vòng lặp tốt hơn với ngắt và tiếp tục

Các vòng lặp for phức tạp hơn thường cần cách thoát sớm hoặc khởi động lại ngay vòng lặp chính với giá trị tiếp theo lần lượt. Để làm như vậy, bash mượn các câu lệnh break và continue phổ biến trong các ngôn ngữ lập trình khác. Dưới đây là một ví dụ sử dụng cả hai để tìm tệp đầu tiên dài hơn 100 ký tự:

#!/bin/bash
for file in *
do
if [ ! -f '$file' ]
then
echo '$file is not a file'
continue
fi
num_chars=$(wc -c <'$file')
echo $file is '$num_chars characters long'
if [ $num_chars -gt 100 ]
then
echo 'Found $file'
break
fi
done

Vòng lặp for ở đây hoạt động trên tất cả các tệp trong thư mục hiện tại. Nếu tệp không phải là tệp thông thường (ví dụ: nếu đó là một thư mục), thì câu lệnh continue được sử dụng để lần lượt khởi động lại vòng lặp với tệp tiếp theo. Nếu đó là một tệp thông thường, khối điều kiện thứ hai sẽ xác định xem nó có chứa nhiều hơn 100 ký tự hay không. Nếu vậy, câu lệnh break được sử dụng để ngay lập tức rời khỏi vòng lặp for (và đến cuối tập lệnh).

Phần kết luận

Tập lệnh bash là một tệp chứa một tập hợp các hướng dẫn có thể được thực thi. Vòng lặp for cho phép một phần của tập lệnh được lặp lại nhiều lần. Với việc sử dụng các biến, các lệnh bên ngoài và các câu lệnh break và continue, các tập lệnh bash có thể áp dụng logic phức tạp hơn và thực hiện một loạt các tác vụ.

Đăng lại Đăng lại tiếng riu ríu E-mail Nâng cấp lên Windows 11 có đáng không?

Windows đã được thiết kế lại. Nhưng điều đó có đủ thuyết phục bạn chuyển từ Windows 10 sang Windows 11?

Đọc tiếp
Chủ đề liên quan
  • Lập trình
  • Linux
Giới thiệu về tác giả Bobby Jack(58 bài báo đã xuất bản)

Bobby là một người đam mê công nghệ, người đã làm việc như một nhà phát triển phần mềm trong gần hai thập kỷ. Anh ấy đam mê chơi game, làm Biên tập viên đánh giá tại Tạp chí Switch Player và đắm mình trong tất cả các khía cạnh của xuất bản trực tuyến và phát triển web.

Xem thêm từ Bobby Jack

Theo dõi bản tin của chúng tôi

Tham gia bản tin của chúng tôi để biết các mẹo công nghệ, đánh giá, sách điện tử miễn phí và các ưu đãi độc quyền!

Bấm vào đây để đăng ký