9 ví dụ về vòng lặp for trong tập lệnh Bash Linux

Tác giả sysadmin, T.M.Một 01, 2023, 04:01:23 CHIỀU

« Chủ đề trước - Chủ đề tiếp »

0 Thành viên và 1 Khách đang xem chủ đề.

9 ví dụ về vòng lặp for trong tập lệnh Bash Linux


Cách lặp lại chính mình, một cách tao nhã.

  • Vòng lặp Bash for là một công cụ linh hoạt có thể hoạt động với số, từ, mảng, biến dòng lệnh hoặc đầu ra của các lệnh khác.
  • Vòng lặp for đơn giản có thể được sử dụng với danh sách số hoặc danh sách từ, cho phép bạn lặp lại một phần mã cho mỗi giá trị trong danh sách.
  • Vòng lặp for cũng có thể được sử dụng với dãy số, tên tệp, tham số dòng lệnh, mảng từ và mảng kết hợp, mang lại sự linh hoạt trong các tác vụ viết kịch bản.

Vòng lặp Bash linh hoạt for thực hiện được nhiều việc hơn là lặp lại một số lần nhất định. Chúng tôi mô tả nhiều biến thể của nó để bạn có thể sử dụng chúng thành công trong tập lệnh Linux của riêng mình.

1. Vòng lặp for

Tất cả các ngôn ngữ kịch bản và lập trình đều có một số cách xử lý các vòng lặp. Vòng lặp là một phần mã mà bạn muốn thực thi nhiều lần. Thay vì nhập đi nhập lại cùng một bộ hướng dẫn vào tập lệnh của bạn, một vòng lặp sẽ lặp đi lặp lại một phần mã cho bạn.

Vòng lặp Bash for rất linh hoạt. Nó có thể hoạt động với số, từ, mảng, biến dòng lệnh hoặc đầu ra của các lệnh khác. Chúng được sử dụng trong tiêu đề của vòng lặp. Tiêu đề cho biết vòng lặp đang hoạt động với những gì --- ví dụ như số hoặc chuỗi --- và điều kiện cuối cùng sẽ dừng vòng lặp là gì.

Phần thân của vòng lặp chứa mã mà bạn muốn lặp lại. Nó chứa những gì bạn muốn vòng lặp thực hiện. Phần thân vòng lặp có thể chứa bất kỳ lệnh script hợp lệ nào.

Một biến được gọi là bộ đếm vòng lặp hoặc trình vòng lặp được sử dụng để duyệt qua một phạm vi giá trị hoặc danh sách các mục dữ liệu. Đối với mỗi vòng lặp, trình vòng lặp sẽ nhận giá trị của số, chuỗi tiếp theo hoặc bất kỳ kiểu dữ liệu nào mà vòng lặp đang lặp lại. Điều này cho phép vòng lặp hoạt động lần lượt với các giá trị của từng mục dữ liệu hoặc thậm chí trong một số trường hợp để tự thao tác với các mục dữ liệu đó.

2. Đơn giản cho vòng lặp

Nếu bạn đang muốn viết vòng lặp for đầu tiên, những ví dụ đơn giản này sẽ giúp bạn bắt đầu.

2.1. Vòng lặp for sử dụng danh sách số

Bạn có thể chạy một for vòng lặp trên dòng lệnh. Lệnh này tạo và thực hiện một for vòng lặp đơn giản. Trình vòng lặp là một biến được gọi là i. Chúng ta sẽ ilần lượt gán từng giá trị trong danh sách các số. Phần thân của vòng lặp sẽ in giá trị đó ra cửa sổ terminal. Điều kiện kết thúc vòng lặp này là khi iđã lặp qua toàn bộ danh sách các số.

Mã nguồn [Chọn]
for i in 1 2 3 4 5; do echo $i; done

Điều quan trọng cần lưu ý ở đây là biến i được tăng thêm một mỗi lần vòng lặp quay, nhưng đó là do danh sách các số tăng lên một mỗi lần.

Danh sách các số này bắt đầu từ số 3 và tăng dần theo từng bước hai, sau đó nhảy tùy ý lên 44.

Mã nguồn [Chọn]
for i in 3 5 7 9 11 44; do echo $i; done

Nó không có sự khác biệt đối với for vòng lặp. Nó bắt đầu ở một đầu của danh sách và sử dụng lần lượt từng giá trị cho đến khi tất cả các giá trị trong danh sách đã được sử dụng.

Các con số cũng không cần phải theo thứ tự tăng dần. Chúng có thể theo bất kỳ thứ tự nào.

Mã nguồn [Chọn]
for i in 3 43 44 11 9; do echo $i; done

1.2. Vòng lặp for sử dụng danh sách từ

Chúng ta có thể dễ dàng làm điều tương tự với lời nói. Sao chép văn bản của tập lệnh vào trình chỉnh sửa và lưu dưới dạng "word-list.sh."

Mã nguồn [Chọn]
#!/bin/bash
for word in This is a sequence of words
do
 echo $word
done

Bạn sẽ cần sử dụng chmod để làm cho tập lệnh có thể thực thi được và bất kỳ tập lệnh nào khác mà bạn sao chép ra khỏi bài viết này. Chỉ cần thay thế tên của tập lệnh mỗi lần bạn sử dụng chmodlệnh.

Mã nguồn [Chọn]
chmod +x word-list.sh
Hãy chạy kịch bản.

Mã nguồn [Chọn]
./word-list.sh

Giống như đã làm với các con số, trình vòng lặp---trong ví dụ này, biến word---làm việc theo cách của nó xuyên qua danh sách các mục dữ liệu cho đến khi đến cuối danh sách. Phần thân vòng lặp truy cập giá trị trong wordbiến và do đó mỗi từ trong danh sách sẽ được xử lý.
 
1.3. Vòng lặp for có dãy số

Nếu bạn muốn một for vòng lặp chạy 100 lần thì sẽ khá mệt mỏi khi phải nhập một chuỗi 100 số vào tiêu đề vòng lặp. Phạm vi số cho phép bạn chỉ định số đầu tiên và số cuối cùng.

Tập lệnh này là "number-range.sh."
 
Mã nguồn [Chọn]
#!/bin/bash
for i in {1..10}
do
 echo "Loop spin:" $i
done

Phạm vi số được xác định trong dấu ngoặc nhọn " {}" với hai dấu chấm ".." ngăn cách các số bắt đầu và kết thúc phạm vi. Đảm bảo bạn không bao gồm bất kỳ khoảng trắng nào trong định nghĩa phạm vi.

Đây là cách nó chạy:

Mã nguồn [Chọn]
./number-range.sh

Bạn có thể bao gồm một số khác xác định kích thước bước mà trình vòng lặp sẽ sử dụng để duyệt qua các số trong phạm vi. Tập lệnh "number-range2.sh" này sẽ sử dụng phạm vi từ 0 đến 32 và kích thước bước là 4.

Mã nguồn [Chọn]
#!/bin/bash
for i in {0..32..4}
do
 echo "Loop spin:" $i
done

Trình vòng lặp bước qua phạm vi số với bước nhảy bốn.

Mã nguồn [Chọn]
./number-range2.sh

1.4. Vòng lặp for sử dụng tên tệp

Bởi vì chúng tôi có thể xử lý danh sách các từ nên chúng tôi có thể làm cho tập lệnh của mình hoạt động với tên tệp. Tập lệnh này được gọi là "filenames.sh."

Mã nguồn [Chọn]
#!/bin/bash
for file in word-list.sh number-range.sh number-range2.sh filenames.sh
do
 ls -lh "$file"
done

Sẽ khá vô nghĩa nếu có một tập lệnh chỉ làm những gì lscó thể làm, nhưng nó minh họa cách truy cập tên tệp bên trong thân vòng lặp.

Mã nguồn [Chọn]
./filenames.sh

Tương tự như cách sử dụng phạm vi số, chúng ta có thể sử dụng mẫu tệp trong tiêu đề vòng lặp để chỉ định các tệp chúng ta muốn xử lý. Điều này tránh phải gõ nhiều và có nghĩa là chúng ta không cần biết trước tên của các tệp.

Tập lệnh này được gọi là "filenames2.sh." Chúng tôi đã thay thế danh sách tên tệp bằng mẫu tên tệp "*.sh" để có báo cáo tập lệnh về tất cả các tệp tập lệnh trong thư mục hiện tại.

Mã nguồn [Chọn]
#!/bin/bash
for file in *.sh
do
 ls -lh "$file"
done

Đây là đầu ra.

Mã nguồn [Chọn]
./filenames2.sh

1.5. Vòng lặp for sử dụng tham số dòng lệnh

Chúng ta có thể linh hoạt hơn bằng cách chuyển mẫu tên tệp trên dòng lệnh. Biến $*đại diện cho tất cả các tham số dòng lệnh được truyền cho tập lệnh.

Đây là "filenames3.sh."

Mã nguồn [Chọn]
#!/bin/bash
for file in $*
do
 ls -lh "$file"
done

Chúng tôi sẽ yêu cầu tên tệp bắt đầu bằng "n" và có phần mở rộng SH.

Mã nguồn [Chọn]
./filenames3.sh n*.sh

Chúng ta cũng có thể chuyển nhiều mẫu cùng một lúc.

Mã nguồn [Chọn]
./filenames3.sh n*.sh.bashrc

Biến iterator file nhận giá trị của từng tham số dòng lệnh. Các mẫu tên tệp được mở rộng và tất cả tên tệp được xử lý trong phần thân vòng lặp.

2. Giống như C cho vòng lặp

Bash hỗ trợ vòng lặp for ba thuật ngữ cổ điển, chẳng hạn như các vòng lặp được tìm thấy trong ngôn ngữ lập trình C. Chúng được gọi là vòng lặp for ba thuật ngữ vì có ba thuật ngữ trong tiêu đề vòng lặp.

  • Giá trị ban đầu của vòng lặp.
  • Kiểm tra xem vòng lặp tiếp tục hay kết thúc.
  • Việc tăng---hoặc giảm---của iterator.

Tập lệnh này là "c-like.sh."

Trình vòng lặp I được đặt thành 1 khi bắt đầu vòng lặp và vòng lặp sẽ chạy cho đến khi câu lệnh " i<=10" còn đúng. Ngay khi iđạt đến 11, for vòng lặp sẽ dừng lại. Trình vòng lặp đang được tăng lên một đơn vị sau mỗi vòng lặp.

Mã nguồn [Chọn]
#!/bin/bashfor (( i=1; i<=10; i++ ))
do
 echo "Loop number:" $i
done

Hãy chạy tập lệnh này.

Mã nguồn [Chọn]
./c-like.sh

Vòng lặp giống C for cho phép dễ dàng tạo for các vòng lặp có yêu cầu hơi kỳ lạ. Vòng lặp này bắt đầu từ 15 và đếm ngược theo bước 3. Đây là "c-like2.sh"

Mã nguồn [Chọn]
#!/bin/bash
for (( i=15; i>0; i-=3 ))
do
 echo "Loop number:" $i
done

Khi chúng tôi chạy nó, nó sẽ nhảy lùi lại theo bước ba.

Mã nguồn [Chọn]
./c-like2.sh

2.1. Vòng lặp for vô hạn

Bạn cũng có thể sử dụng định dạng for vòng lặp này để tạo một vòng lặp vô hạn. Tất cả những gì bạn cần làm là xóa tất cả các phần tử khỏi tiêu đề vòng lặp, như thế này. Đây là "vô   Đăng nhập để xem liên kết."

Mã nguồn [Chọn]
#!/bin/bash
for (( ; ; ))
do
 echo "Press Ctrl+C to stop..."
 sleep 1
done

Bạn sẽ cần nhấn Ctrl+C để dừng vòng lặp.

Mã nguồn [Chọn]
./infinite.sh

2.2. Vòng lặp for sử dụng mảng từ

Chúng ta có thể dễ dàng lặp qua một mảng các từ. Chúng ta cần cung cấp tên của mảng trong tiêu đề vòng lặp và trình lặp sẽ duyệt qua tất cả các mục trong mảng. Đây là "word-array.sh."
 
Mã nguồn [Chọn]
#!/bin/bash
distributions=("Ubuntu Fedora Manjaro Arch EndeavourOS Garuda")
for distro in $distributions
do
 echo $distro
done

Tất cả các bản phân phối được liệt kê cho chúng tôi.

Mã nguồn [Chọn]
./word-array.sh

2.3. Lệnh continue

Nếu bạn muốn vòng lặp bước qua một mục cụ thể, hãy kiểm tra xem trình lặp có khớp với mục đó hay không và sử dụng lệnh continue. Lệnh continuetừ bỏ vòng quay hiện tại của vòng lặp. Nó tăng vòng lặp và bắt đầu vòng quay tiếp theo---giả sử mục bạn muốn bỏ qua không phải là mục cuối cùng trong danh sách.

Đây là "word-array2.sh." Nó bước qua mục nhập mảng "Arch" nhưng xử lý tất cả các thành viên mảng khác.

Mã nguồn [Chọn]
#!/bin/bash
distributions=("Ubuntu Fedora Manjaro Arch EndeavourOS Garuda")
for distro in $distributionsdo
 if [[ "$distro" == "Arch" ]] ;
   then
   continue
 fi
 echo $distro
done

"Arch" không xuất hiện trong cửa sổ terminal.

Mã nguồn [Chọn]
./word-array2.sh

2.4. Lệnh break

Lệnh breakt hoát ra khỏi vòng lặp và ngăn chặn bất kỳ quá trình xử lý nào nữa.

Đây là "word-array3.sh." Nó giống như tập lệnh trước được continuethay thế bằng break.

Mã nguồn [Chọn]
#!/bin/bash
distributions=("Ubuntu Fedora Manjaro Arch EndeavourOS Garuda")
for distro in $distributions
do
 if [[ "$distro" == "Arch" ]] ;
   then
   break
 fi
 echo $distro
done

Khi trình vòng lặp chứa "Arch", vòng lặp for sẽ từ bỏ mọi quá trình xử lý nữa.

Mã nguồn [Chọn]
./word-array3.sh

2.5. Vòng lặp for sử dụng mảng kết hợp

Trong Bash 4 trở lên, mảng kết hợp cho phép bạn tạo danh sách các cặp khóa-giá trị có thể được tìm kiếm theo khóa hoặc theo giá trị. Do mối quan hệ hai chiều giữa khóa và giá trị nên chúng còn được gọi là từ điển dữ liệu.

Chúng ta có thể lặp qua một mảng kết hợp bằng cách sử dụng for vòng lặp. Tập lệnh này là "associative.sh." Nó xác định một mảng kết hợp có bốn mục trong đó, một mục cho mỗi "dog", "cat", "robin" và "human". Đây là những chiếc chìa khóa. Các giá trị là số chân (mặc định) mà mỗi chân có.

Mã nguồn [Chọn]
#!/bin/bash

declare -A animals=( [dog]=Four-legged [cat]=Four-legged [robin]=Two-legged [human]=Two-legged )

for legs in ${!animals[@]}
do
  if [ ${animals[$legs]} == "Two-legged" ]; then
    echo ${legs}
  fi
done

Trình vòng lặp được gọi là legs. Lưu ý rằng tiêu đề vòng lặp chứa !dấu chấm than " ". Đây không hoạt động như toán tử NOT logic, nó là một phần của cú pháp mảng kết hợp. Nó là cần thiết để tìm kiếm trong mảng.

Phần thân vòng lặp thực hiện kiểm tra so sánh chuỗi. Nếu giá trị của thành viên mảng là "Hai chân", nó sẽ in giá trị khóa ra cửa sổ terminal. Khi chúng tôi chạy nó, tập lệnh sẽ in ra những sinh vật hai chân.

Mã nguồn [Chọn]
./associative.sh

2.6. Lặp lại đầu ra của lệnh

Nếu bạn có một lệnh hoặc chuỗi lệnh tạo ra danh sách nội dung nào đó, chẳng hạn như tên tệp, bạn có thể lặp qua chúng bằng một for vòng lặp. Bạn cần chú ý đến việc mở rộng tên tệp không mong muốn, nhưng trong những trường hợp đơn giản thì không sao.

Tập lệnh này là "command.sh." nó sử dụng lsvà wcđể cung cấp một danh sách được sắp xếp các tên tệp tập lệnh, cùng với số dòng, từ và byte của chúng.

Mã nguồn [Chọn]
#!/bin/bashfor i in $(ls *.sh | sort);do echo $(wc $i)done
Khi chạy nó, chúng tôi nhận được số liệu thống kê cho từng tệp, với các tệp được liệt kê theo thứ tự bảng chữ cái.

Mã nguồn [Chọn]
./command.sh

3. Vòng lặp rực rỡ

Vòng lặp for là một công cụ viết kịch bản linh hoạt và dễ hiểu. Nhưng dù linh hoạt đến đâu, đừng quên rằng các vòng lặp khác tồn tại đều có lý do. Đừng bị choáng ngợp khi nghĩ rằng vòng for lặp là tất cả những gì bạn cần.

Ví dụ, vòng lặp while phù hợp hơn với một số thứ nhất định so với for vòng lặp, chẳng hạn như đọc các dòng từ một tệp.

Viết kịch bản tốt có nghĩa là sử dụng công cụ phù hợp nhất cho nhiệm vụ hiện tại. Vòng lặp for là một công cụ tuyệt vời cần có trong hộp công cụ thủ thuật của bạn.