Tin tức và phân tích của tất cả các thiết bị di động

5 Ví dụ về Bash hữu ích cho vòng lặp

Hãy tưởng tượng bạn có một thư mục chứa hàng nghìn tệp và bạn được yêu cầu xử lý từng tệp này. Nghe có vẻ khá nhàm chán phải không? Chà, nếu bạn đang sử dụng vòng lặp For trong tập lệnh Bash. Vòng lặp for trong tập lệnh bash là một công cụ kỳ diệu có thể giúp bạn tự động hóa mọi tác vụ lặp đi lặp lại trong khi xử lý hiệu quả các tệp đó mà không phải đổ mồ hôi. Trong bài viết này, chúng ta thảo luận về vòng lặp for trong bash là gì cùng với một số ví dụ thực tế để biến việc tự động hóa thành một trò chơi dành cho trẻ em.

Vòng lặp For trong Bash Script là gì

Vòng lặp for là một cấu trúc điều khiển được sử dụng để thực hiện các tác vụ lặp đi lặp lại hoặc thực hiện một loạt lệnh với số lần cụ thể. Với vòng lặp for, bạn có thể lặp qua các số, danh sách, tệp hoặc thậm chí các thư mục.

Bash For Loop: Cú pháp kiểu POSIX

Cú pháp kiểu POSIX (Giao diện hệ điều hành di động) có thể được sử dụng với các shell tuân thủ POSIX như bash và có thể được sử dụng để lặp qua danh sách các tệp, bất kỳ chuỗi nào hoặc thậm chí là đầu ra của các lệnh khác. Đây là cú pháp vòng lặp for trong tập lệnh bash:

for <loop_variable> in <list_to_iterate>
do
    <Commands_to_be_executed_in_each_iteration>
done

Trong cú pháp trên, đây là ý nghĩa của mọi thứ:

  • là biến do người dùng xác định chứa từng mục từ .
  • đề cập đến danh sách các mục mà vòng lặp for cần lặp lại. Nó có thể là danh sách các số, chuỗi, đầu ra của lệnh, v.v.
  • từ khóa do biểu thị sự bắt đầu của vòng lặp for.
  • chứa các lệnh hoặc câu lệnh sẽ được thực thi cho mỗi lần lặp.
  • Từ khóa done biểu thị sự kết thúc của vòng lặp for.

Bây giờ chúng ta hãy xem một số ví dụ thực tế dựa trên kiểu vòng lặp POSIX:

Ví dụ 1: Lặp qua một phạm vi nhất định

#!/bin/bash

# Print numbers from 1 to 5
for i in $(seq 1 5); do
    echo $i
done

Trong đoạn mã trên, $(seq 1 5) được sử dụng để tạo danh sách các số nguyên từ 1 ĐẾN 5. Sau đó, nó sẽ lặp lại từng danh sách một và sau đó mỗi giá trị sẽ được in trên một dòng mới.

Ví dụ 2: Lặp qua một mảng

#!/bin/bash

fruits=("Apple" "Banana" "Orange" "Grapes")

for fruit in "${fruits[@]}"; do
    echo "Fruit: $fruit"
done

Mảng là một cấu trúc dữ liệu được sử dụng để chứa nhiều dữ liệu thuộc các loại khác nhau. Trong đoạn trích trên:

  • Dòng trái cây=(“Apple” “Banana” “Orange” “Grapes”) được sử dụng để khai báo mảng chứa bốn tên trái cây khác nhau.
  • Dòng “cho trái cây trong “${fruits[@]}”; do” thiết lập Vòng lặp For. Nó chỉ định biến “fruit” để giữ giá trị phần tử hiện tại và “${fruits[@]}” làm mảng được lặp lại. “@“, trong “${fruits[@]}“, đại diện cho tất cả các phần tử của mảng.
  • Dòng “echo “Fruit: $fruit” ” in tên mỗi loại trái cây trên một dòng mới cùng với từ “Fruit” trong mỗi lần lặp.
  • Cuối cùng dòng cuối cùng “done” biểu thị sự kết thúc của vòng lặp for.

Đây là đầu ra chúng ta sẽ nhận được từ các lệnh trên:

Ví dụ 3: Vòng lặp với thay thế lệnh

#!/bin/bash
for file in $(ls); do
    echo "File: $file"
done

Cách hoạt động của tính năng thay thế lệnh là lệnh được thực thi đầu tiên và sau đó vòng lặp for sẽ lặp qua toàn bộ đầu ra của lệnh. Lệnh được lặp lại được đặt bên trong “$()“. Trong đoạn trích trên:

  • Trong dòng dành cho tệp trong $(ls); làm, phần $(ls) sẽ thực thi lệnh ‘ls’ và đầu ra của nó (danh sách các tệp trong thư mục hiện tại) được sử dụng làm đầu vào cho vòng lặp. Vòng lặp sẽ lặp qua từng tên tệp được tìm thấy ở đầu ra.
  • Dòng echo “File: $file” in giá trị của biến “file” cùng với tiền tố “File: ” trong mỗi lần lặp. Biến “file” chứa tên của file hiện tại đang được xử lý trong vòng lặp.
  • Cuối cùng dòng cuối cùng “done” biểu thị sự kết thúc của vòng lặp for.

Đầu ra của vòng lặp for với sự thay thế lệnh như được minh họa trong ví dụ trên sẽ là:

Bash For Loop: Cú pháp kiểu C

Cú pháp kiểu C phù hợp với những người dùng đã quen với cú pháp vòng lặp for trong các ngôn ngữ khác như C, C++, Java, JavaScript, v.v. Đây là cú pháp cơ bản cho vòng lặp kiểu C:

for ((<variable_initialization>; <test_condition>; <step_value>))
do
    <commands_to_execute>
done

Trong cú pháp trên:

  • đề cập đến giá trị ban đầu mà biến vòng lặp sẽ bắt đầu từ đó.
  • xác định điều kiện mà đầu ra sẽ phụ thuộc vào; điều kiện này được kiểm tra trong mỗi lần lặp.
  • đề cập đến giá trị mà biến vòng lặp cần được cập nhật.
  • đề cập đến các lệnh hoặc câu lệnh cần được thực thi cho mỗi lần lặp.

Bây giờ chúng ta hãy xem một số ví dụ thực tế dựa trên vòng lặp for kiểu C:

Ví dụ 1: In số lẻ từ 1 đến 10

!#/bin/bash

for((i = 1; i <= 10; i = i + 1))
do
    if (( i % 2 == 1 ))
    then
        echo "Odd Number: $i"
    fi
done

Trong đoạn trích trên:

  • Dòng cho ((i = 1; tôi <= 10; tôi = tôi + 1)) khởi tạo biến vòng lặp thành 1kiểm tra xem “giá trị của i nhỏ hơn hay bằng 10” cho mỗi lần lặp và cuối cùng tăng giá trị của i bằng cách thêm 1 về giá trị hiện tại sau mỗi lần lặp.
  • nếu tôi % 2 == 1 )) kiểm tra xem giá trị còn lại khi chia giá trị hiện tại của i cho 2 bằng 1 hay không –
    • nếu chia hết thì dòng echo “Số lẻ: $i” sẽ được thực thi in giá trị của i.
    • dòng fi biểu thị sự kết thúc của điều kiện if.
  • Cuối cùng, dòng cuối cùng phân định điểm cuối của vòng lặp for và được thực thi ở cuối.

Đây là kết quả đầu ra bạn sẽ nhận được cho đoạn mã trên:

Ví dụ 2: Lặp qua một mảng

#!/bin/bash

fruits=("Apple" "Banana" "Orange" "Grapes")
for ((i = 0; i < ${#fruits[@]}; i++)); do
    echo "Fruit $((i+1)): ${fruits[i]}"
done

Trong đoạn mã trên:

  • hoa quả=(“Apple” “Chuối” “Cam” “Nho”) tạo ra một mảng tên tất cả các loại trái cây.
  • vì ((tôi = 0; tôi < ${#trái cây[@]}; i++)) trước tiên khởi tạo biến vòng lặp “i” thành 0 biến này cũng sẽ đóng vai trò là biến chỉ mục cho mảng và vòng lặp tiếp tục miễn là “i” nhỏ hơn số phần tử trong mảng “fruits” (ký hiệu là ${#fruits[@]}). Vòng lặp tăng “i” thêm 1 trong mỗi lần lặp.
  • Vì các chỉ số mảng bắt đầu từ 0 nhưng chúng tôi muốn hiển thị chúng khi bắt đầu từ 1dòng echo “Fruit $((i+1)): ${trái cây[i]}” in giá trị bằng chỉ số hiện tại “i” plus 1.
  • Cuối cùng, dòng cuối cùng biểu thị sự kết thúc của vòng lặp for

Đây là đầu ra của vòng lặp for ở trên:

Mục lục