Vòng lặp là một trong những cấu trúc cơ bản và mạnh mẽ nhất trong điện toán, bởi vì nó cho phép chúng ta lặp lại một tập hợp các lệnh, bao nhiêu lần tùy ý, trên một danh sách các mục mà chúng ta chọn. Phần lớn tư duy máy tính liên quan đến việc thực hiện một nhiệm vụ và giải quyết nó theo cách có thể được áp dụng lặp đi lặp lại cho tất cả các nhiệm vụ tương tự khác và vòng lặp for là cách chúng ta khiến máy tính thực hiện công việc lặp đi lặp lại đó
for item in $items
do
task $item
done
Không giống như hầu hết các đoạn mã mà chúng ta đã viết ở dấu nhắc tương tác, vòng lặp for không thực thi ngay khi chúng ta nhấn Enter
user@host:~$ for item in $items
Chúng ta có thể viết bao nhiêu lệnh tùy thích trong khối giữa các từ khóa
do
command_1
command_2
# another for loop just for fun
for a in $things; do; command_3 a; done
command_4
done
3 và do
command_1
command_2
# another for loop just for fun
for a in $things; do; command_3 a; done
command_4
done
4do
command_1
command_2
# another for loop just for fun
for a in $things; do; command_3 a; done
command_4
done
Chỉ cho đến khi chúng tôi đạt đến
do
command_1
command_2
# another for loop just for fun
for a in $things; do; command_3 a; done
command_4
done
4 và nhấn Enter, vòng lặp for mới thực hiện công việc của nóĐiều này về cơ bản khác với lệnh và phản hồi từng dòng mà chúng tôi đã trải nghiệm cho đến nay tại dấu nhắc. Và nó báo trước cách chúng ta sẽ lập trình thêm về. ít nhấn mạnh hơn vào việc thực thi các lệnh với từng dòng và nhấn mạnh hơn vào việc lập kế hoạch cho chức năng của chương trình, sau đó thực hiện nó sau
Cú pháp cơ bản
Cú pháp của vòng lặp
do
command_1
command_2
# another for loop just for fun
for a in $things; do; command_3 a; done
command_4
done
6 có thể gây nhầm lẫn, vì vậy đây là một số ví dụ cơ bản để chuẩn bị/làm mới sự hiểu biết của bạn về chúngfor animal in dog cat 'fruit bat' elephant ostrich
do
echo "I want a $animal for a pet"
done
Đây là một phiên bản phức tạp hơn sử dụng các biến
________số 8Có thể sử dụng thay thế lệnh để tạo các mục mà vòng lặp
do
command_1
command_2
# another for loop just for fun
for a in $things; do; command_3 a; done
command_4
done
6 lặp quauser@host:~$ for item in $items
0Nếu bạn cần đọc danh sách các dòng từ một tệp và hoàn toàn chắc chắn rằng không có dòng nào chứa khoảng trắng trong đó
user@host:~$ for item in $items
1Vòng lặp đọc-trong khi là một biến thể của vòng lặp trên, nhưng an toàn hơn khi đọc các dòng từ tệp
user@host:~$ for item in $items
2Xây dựng vòng lặp for cơ bản
Hãy bắt đầu lại từ đầu, với một vòng lặp
do
command_1
command_2
# another for loop just for fun
for a in $things; do; command_3 a; done
command_4
done
6 rất tối thiểu, sau đó xây dựng nó thành một thứ phức tạp hơn, để giúp chúng ta hiểu được mục đích của chúngVòng lặp đơn giản nhất
Điều này đơn giản như bạn có thể tạo một vòng lặp for
user@host:~$ for item in $items
4Điều đó có vẻ khá vô giá trị? . Tôi đã viết bốn dòng mã để làm những gì cần một dòng để làm,
do
command_1
command_2
# another for loop just for fun
for a in $things; do; command_3 a; done
command_4
done
9Các yếu tố khác trong bộ sưu tập
Thật khó để nói, nhưng một "vòng lặp" đã thực hiện. Nó chỉ thực hiện một lần. OK, vậy làm thế nào để chúng ta làm cho nó thực thi nhiều hơn một lần? . Hãy thêm bốn
for animal in dog cat 'fruit bat' elephant ostrich
do
echo "I want a $animal for a pet"
done
1 nữauser@host:~$ for item in $items
8OK, không thú vị lắm, nhưng chương trình dường như ít nhất là lặp lại. bốn
for animal in dog cat 'fruit bat' elephant ostrich
do
echo "I want a $animal for a pet"
done
1 dẫn đến bốn lệnh for animal in dog cat 'fruit bat' elephant ostrich
do
echo "I want a $animal for a pet"
done
3 được thực thiĐiều gì xảy ra khi chúng ta thay thế bốn số
for animal in dog cat 'fruit bat' elephant ostrich
do
echo "I want a $animal for a pet"
done
1 đó bằng các số khác nhau? user@host:~$ for item in $items
0Và…không có gì. Vì vậy, vòng lặp không tự động thực hiện bất kỳ điều gì cụ thể đối với tập hợp các giá trị mà chúng tôi đã cung cấp cho nó. Dù sao thì vẫn chưa
Tham khảo biến vòng lặp
Hãy nhìn sang bên trái của từ khóa
for animal in dog cat 'fruit bat' elephant ostrich
do
echo "I want a $animal for a pet"
done
0, và tại đó for animal in dog cat 'fruit bat' elephant ostrich
do
echo "I want a $animal for a pet"
done
6. Điểm của for animal in dog cat 'fruit bat' elephant ostrich
do
echo "I want a $animal for a pet"
done
6 đó là gì? . Vì vậy, có lẽ nó là một biến? user@host:~$ for item in $items
1Chơi lô tô. Đây gần như là hoạt động cơ bản của vòng lặp
do
command_1
command_2
# another for loop just for fun
for a in $things; do; command_3 a; done
command_4
done
6. - Nhận tập hợp các mục/giá trị [for thing in $collection_of_things
do
some_program $thing
another_program $thing >> data.txt
# as many commands as we want
done
1] - Chuyển chúng vào cấu trúc vòng lặp do
command_1
command_2
# another for loop just for fun
for a in $things; do; command_3 a; done
command_4
done
6 - Sử dụng biến vòng lặp [for animal in dog cat 'fruit bat' elephant ostrich
do
echo "I want a $animal for a pet"
done
6] làm trình giữ chỗ, viết các lệnh giữa khối do
command_1
command_2
# another for loop just for fun
for a in $things; do; command_3 a; done
command_4
done
3/do
command_1
command_2
# another for loop just for fun
for a in $things; do; command_3 a; done
command_4
done
4. - Khi vòng lặp thực thi, biến vòng lặp, for animal in dog cat 'fruit bat' elephant ostrich
do
echo "I want a $animal for a pet"
done
6, nhận giá trị của từng mục trong danh sách – for thing in $collection_of_things
do
some_program $thing
another_program $thing >> data.txt
# as many commands as we want
done
7, for thing in $collection_of_things
do
some_program $thing
another_program $thing >> data.txt
# as many commands as we want
done
8, for thing in $collection_of_things
do
some_program $thing
another_program $thing >> data.txt
# as many commands as we want
done
9, user@host:~$ for item in $items
00, – và khối lệnh giữa do
command_1
command_2
# another for loop just for fun
for a in $things; do; command_3 a; done
command_4
done
3 và do
command_1
command_2
# another for loop just for fun
for a in $things; do; command_3 a; done
command_4
done
4 sau đó được thực thi. Trình tự này lặp lại một lần cho mọi mục trong danh sáchKhối
do
command_1
command_2
# another for loop just for fun
for a in $things; do; command_3 a; done
command_4
done
3/do
command_1
command_2
# another for loop just for fun
for a in $things; do; command_3 a; done
command_4
done
4 có thể chứa bất kỳ chuỗi lệnh nào, thậm chí là một vòng lặp do
command_1
command_2
# another for loop just for fun
for a in $things; do; command_3 a; done
command_4
done
6 khácuser@host:~$ for item in $items
2____13Vòng lặp trong vòng lặp là một cấu trúc phổ biến trong lập trình. Phần lớn, tôi sẽ cố gắng tránh gán các vấn đề liên quan đến loại logic này, vì có thể khó gỡ xoắn trong quá trình gỡ lỗi
Đọc tệp, từng dòng một, đáng tin cậy với tính năng đọc trong khi
Bởi vì
user@host:~$ for item in $items
06 in một tệp theo từng dòng, vòng lặp for sau đây có vẻ hợp lýuser@host:~$ for item in $items
4Tuy nhiên, việc thay thế lệnh sẽ khiến
user@host:~$ for item in $items
06 chia các từ theo khoảng trắng. Nếu user@host:~$ for item in $items
08 chứa những điều sau đâyuser@host:~$ for item in $items
5Đầu ra của vòng lặp
do
command_1
command_2
# another for loop just for fun
for a in $things; do; command_3 a; done
command_4
done
6 sẽ là thế nàyuser@host:~$ for item in $items
6Vòng lặp đọc-trong khi sẽ giữ nguyên các từ trong một dòng
user@host:~$ for item in $items
7Chúng ta cũng có thể chuyển từ kết quả của một lệnh bằng cách đặt nó trong
user@host:~$ for item in $items
10 và user@host:~$ for item in $items
11user@host:~$ for item in $items
8Ống và vòng
Nếu bạn đến từ các ngôn ngữ khác, các luồng dữ liệu có thể không quen thuộc với bạn. Ít nhất chúng là đối với tôi, vì cú pháp làm việc với chúng trong Bash trực tiếp và đơn giản hơn nhiều so với trong Ruby hoặc Python
Tuy nhiên, nếu bạn chưa quen với lập trình bằng bất kỳ ngôn ngữ nào, điều có thể không rõ ràng là cách làm việc với các luồng dữ liệu khác với làm việc với các vòng lặp
Ví dụ, đoạn mã sau
user@host:~$ for item in $items
9– tạo ra cùng một đầu ra như vòng lặp này
do
command_1
command_2
# another for loop just for fun
for a in $things; do; command_3 a; done
command_4
done
0Và tùy thuộc vào mô hình tinh thần của bạn về mọi thứ, có vẻ như trong cả hai ví dụ, mỗi từ, e. g.
user@host:~$ for item in $items
12, user@host:~$ for item in $items
13, được chuyển qua quá trình dịch mã [thông qua user@host:~$ for item in $items
14] và sau đó được lặp lạiỐng và bộ lọc
Không đi sâu vào các nguyên tắc cơ bản của hệ thống Unix, trong đó một đường ống hoạt động về cơ bản khác với một vòng lặp ở đây, hãy để tôi đề xuất một cách giải quyết tinh thần
Các chương trình dẫn từ thiết bị xuất chuẩn và thiết bị xuất chuẩn thường có thể được sắp xếp dưới dạng bộ lọc, trong đó luồng dữ liệu đi vào chương trình và xuất hiện ở định dạng khác
do
command_1
command_2
# another for loop just for fun
for a in $things; do; command_3 a; done
command_4
done
1Đối với các tác vụ không chỉ chuyển đổi dữ liệu, từ bộ lọc này sang bộ lọc khác, hãy nghĩ đến việc sử dụng vòng lặp. Một nhiệm vụ như vậy có thể là gì?