Computer >> Máy Tính >  >> Lập trình >> Lập trình BASH

12 Ví dụ về vòng lặp Bash cho Linux Shell Scripting của bạn

12 Ví dụ về vòng lặp Bash cho Linux Shell Scripting của bạn Có hai loại bash cho các vòng lặp. Một sử dụng từ khóa “in” với danh sách các giá trị, một sử dụng cú pháp lập trình C như cú pháp.

Bài viết này là một phần của loạt bài hướng dẫn bash đang thực hiện của chúng tôi.

Điều này giải thích cả hai phương thức vòng lặp bash for và cung cấp 12 ví dụ khác nhau về cách sử dụng vòng lặp bash for trong các tập lệnh shell của bạn.

Đánh dấu bài viết này để tham khảo trong tương lai, vì đây là bài viết duy nhất bạn sẽ cần tham khảo cách sử dụng vòng lặp bash for với các ví dụ.

Phương pháp 1:Bash For Loop sử dụng “in” và danh sách các giá trị

Cú pháp:

for varname in list
do
 command1
 command2
 ..
done

Trong cú pháp trên:

  • cho, đang, làm và hoàn thành là các từ khóa
  • “danh sách” chứa danh sách các giá trị. Danh sách có thể là một biến chứa một số từ được phân tách bằng dấu cách. Nếu thiếu danh sách trong câu lệnh for, thì nó sẽ nhận tham số vị trí đã được truyền vào shell.
  • varname là bất kỳ tên biến Bash nào.

Trong biểu mẫu này, câu lệnh for thực hiện các lệnh nằm trong một phần nội dung, một lần cho mỗi mục trong danh sách. Ví dụ:nếu danh sách giá trị chứa 5 mục, vòng lặp for sẽ được thực hiện tổng cộng 5 lần, một lần cho mỗi mục trong danh sách. Mục hiện tại từ danh sách sẽ được lưu trữ trong một biến “varname” mỗi lần qua vòng lặp. “Varname” này có thể được xử lý trong phần thân của vòng lặp for.

Phương pháp 2:Bash For Loop sử dụng cú pháp C like

Dạng thứ hai của vòng lặp for tương tự như vòng lặp for trong ngôn ngữ lập trình “C”, có ba biểu thức (khởi tạo, điều kiện và cập nhật).

for (( expr1; expr2; expr3 ))
do
 command1
 command2
 ..
done

Trong bash ở trên cho cú pháp lệnh,

  • Trước lần lặp đầu tiên, expr1 được đánh giá. Điều này thường được sử dụng để khởi tạo các biến cho vòng lặp.
  • Tất cả các câu lệnh giữa do và done được thực thi lặp đi lặp lại cho đến khi giá trị của expr2 là TRUE.
  • Sau mỗi lần lặp lại của vòng lặp, expr3 được đánh giá. Điều này thường được sử dụng để tăng bộ đếm vòng lặp.

12 ví dụ sau đây cho thấy cách bash cho các vòng lặp theo những cách khác nhau.

1. Giá trị tĩnh cho danh sách sau từ khóa “in”

Trong ví dụ sau, danh sách các giá trị (Thứ Hai, Thứ Ba, Thứ Tư, Thứ Sáu và Thứ Sáu) được đưa ra trực tiếp sau từ khóa “in” trong vòng lặp bash for.

$ cat for1.sh
i=1
for day in Mon Tue Wed Thu Fri
do
 echo "Weekday $((i++)) : $day"
done

$ ./for1.sh
Weekday 1 : Mon
Weekday 2 : Tue
Weekday 3 : Wed
Weekday 4 : Thu
Weekday 5 : Fri

Thận trọng: Danh sách các giá trị không được phân tách bằng dấu phẩy (Thứ Hai, Thứ Ba, Thứ Tư, Thứ Năm, Thứ Sáu). Dấu phẩy sẽ được coi là một phần của giá trị. tức là Thay vì "Thứ Hai", nó sẽ sử dụng "Thứ Hai" làm giá trị như được hiển thị trong ví dụ bên dưới.

$ cat for1-wrong1.sh
i=1
for day in Mon, Tue, Wed, Thu, Fri
do
 echo "Weekday $((i++)) : $day"
done

$ ./for1-wrong1.sh
Weekday 1 : Mon,
Weekday 2 : Tue,
Weekday 3 : Wed,
Weekday 4 : Thu,
Weekday 5 : Fri

Thận trọng: Danh sách các giá trị không được đặt trong một dấu ngoặc kép. (“Thứ Hai, Thứ Tư, Thứ Sáu, Thứ Sáu”). Nếu bạn đặt trong dấu ngoặc kép, nó sẽ được coi là một giá trị duy nhất (thay vì 5 giá trị khác nhau), như được hiển thị trong ví dụ bên dưới.

$ cat for1-wrong2.sh
i=1
for day in "Mon Tue Wed Thu Fri"
do
 echo "Weekday $((i++)) : $day"
done

$ ./for1-wrong2.sh
Weekday 1 : Mon Tue Wed Thu Fri

2. Biến cho danh sách sau từ khóa “in”

Thay vì cung cấp các giá trị trực tiếp trong vòng lặp for, bạn có thể lưu trữ các giá trị trong một biến và sử dụng biến trong vòng lặp for sau từ khóa “in”, như được hiển thị trong ví dụ sau.

$ cat for2.sh
i=1
weekdays="Mon Tue Wed Thu Fri"
for day in $weekdays
do
 echo "Weekday $((i++)) : $day"
done

$ ./for2.sh
Weekday 1 : Mon
Weekday 2 : Tue
Weekday 3 : Wed
Weekday 4 : Thu
Weekday 5 : Fri

Thận trọng :Cách tốt nhất, bạn nên luôn trích dẫn các biến bash khi bạn đang tham khảo nó. Có một vài ngoại lệ đối với quy tắc thực hành tốt nhất này. Đây là một trong số họ. Nếu bạn trích dẫn kép biến trong vòng lặp for này, danh sách các giá trị sẽ được coi là giá trị đơn. Rất nhiều người rơi vào bẫy này. Hãy cẩn thận và không trích dẫn kép biến của bạn trong vòng lặp for.

$ cat for2-wrong.sh
i=1
weekdays="Mon Tue Wed Thu Fri"
for day in "$weekdays"
do
 echo "Weekday $((i++)) : $day"
done

$ ./for2-wrong.sh
Weekday 1 : Mon Tue Wed Thu Fri

3. Không chỉ định danh sách; lấy nó từ các tham số vị trí

Nếu bạn không chỉ định từ khóa “in” theo sau bởi bất kỳ danh sách giá trị nào trong vòng lặp bash for, nó sẽ sử dụng các tham số vị trí (tức là các đối số được chuyển đến tập lệnh shell).

$ cat for3.sh
i=1
for day
do
 echo "Weekday $((i++)) : $day"
done

$ ./for3.sh Mon Tue Wed Thu Fri
Weekday 1 : Mon
Weekday 2 : Tue
Weekday 3 : Wed
Weekday 4 : Thu
Weekday 5 : Fri

Thận trọng: Hãy cẩn thận nếu bạn sử dụng phương pháp này. Bạn không nên bao gồm từ khóa “in” trong vòng lặp for. Nếu bạn để từ khóa “in” mà không có bất kỳ giá trị nào, nó sẽ không sử dụng tham số vị trí như được hiển thị bên dưới. Nó sẽ không đi vào bên trong vòng lặp. tức là vòng lặp for sẽ không bao giờ được thực thi như được hiển thị trong ví dụ bên dưới.

$ cat for3-wrong.sh
i=1
for day in
do
 echo "Weekday $((i++)) : $day"
done

$ ./for3-wrong.sh Mon Tue Wed Thu Fri

Lưu ý :Tham khảo bài viết trước của chúng tôi để hiểu thêm về các tham số vị trí bash.

4. Lệnh Unix xuất ra dưới dạng giá trị danh sách sau từ khóa “in”

Bạn có thể sử dụng đầu ra của bất kỳ lệnh UNIX / Linux nào dưới dạng danh sách các giá trị cho vòng lặp for bằng cách đặt lệnh trong dấu tích ngược '' như hình dưới đây.

$ cat for4.sh
i=1
for username in `awk -F: '{print $1}' /etc/passwd`
do
 echo "Username $((i++)) : $username"
done

$ ./for4.sh
Username 1 : ramesh
Username 2 : john
Username 3 : preeti
Username 4 : jason
..

5. Lặp qua các tệp và thư mục trong vòng lặp for

Để lặp qua các tệp và thư mục trong một thư mục cụ thể, chỉ cần cd vào thư mục đó và cho * trong vòng lặp for như được hiển thị bên dưới.

Ví dụ sau sẽ lặp lại tất cả các tệp và thư mục trong thư mục chính của bạn.

$ cat for5.sh
i=1
cd ~
for item in *
do
 echo "Item $((i++)) : $item"
done

$ ./for5.sh
Item 1 : positional-parameters.sh
Item 2 : backup.sh
Item 3 : emp-report.awk
Item 4 : item-list.sed
Item 5 : employee.db
Item 8 : storage
Item 9 : downloads

Cách sử dụng * trong vòng lặp bash for tương tự như tệp globbing mà chúng ta sử dụng trong dòng lệnh linux khi chúng ta sử dụng lệnh ls (và các lệnh khác).

Ví dụ, phần sau sẽ hiển thị tất cả các tệp và thư mục trong thư mục chính của bạn. Đây là khái niệm được sử dụng trong ví dụ for5.sh ở trên.

cd ~
ls *

Phần sau sẽ hiển thị tất cả tệp * .conf bắt đầu bằng a, b hoặc, c hoặc d trong thư mục / etc.

$ ls -1 /etc/[abcd]*.conf
/etc/asound.conf
/etc/autofs_ldap_auth.conf
/etc/cas.conf
/etc/cgconfig.conf
/etc/cgrules.conf
/etc/dracut.conf

Đối số tương tự được sử dụng trong lệnh ls ở trên, có thể được sử dụng trong vòng lặp bash for, như được hiển thị trong ví dụ bên dưới.

$ cat for5-1.sh
i=1
for file in /etc/[abcd]*.conf
do
 echo "File $((i++)) : $file"
done

$ ./for5-1.sh
File 1 : /etc/asound.conf
File 2 : /etc/autofs_ldap_auth.conf
File 3 : /etc/cas.conf
File 4 : /etc/cgconfig.conf
File 5 : /etc/cgrules.conf
File 6 : /etc/dracut.conf

6. Thoát ra khỏi vòng lặp for

Bạn có thể thoát khỏi vòng lặp for bằng lệnh ‘break’ như hình dưới đây.

$ cat for6.sh
i=1
for day in Mon Tue Wed Thu Fri
do
 echo "Weekday $((i++)) : $day"
 if [ $i -eq 3 ]; then
 break;
 fi
done

$ ./for6.sh
Weekday 1 : Mon
Weekday 2 : Tue

7. Tiếp tục từ đầu vòng lặp for

Trong một số điều kiện nhất định, bạn có thể bỏ qua phần còn lại của các lệnh trong vòng lặp for và tiếp tục vòng lặp từ trên cùng một lần nữa (đối với giá trị tiếp theo trong danh sách), sử dụng lệnh tiếp tục như được hiển thị bên dưới.

Ví dụ sau thêm “(WEEKEND)” vào Thứ Bảy và Chủ Nhật, và “(ngày trong tuần)” vào các ngày còn lại.

$ cat for7.sh
i=1
for day in Mon Tue Wed Thu Fri Sat Sun
do
 echo -n "Day $((i++)) : $day"
 if [ $i -eq 7 -o $i -eq 8 ]; then
 echo " (WEEKEND)"
 continue;
 fi
 echo " (weekday)"
done

$ ./for7.sh
Day 1 : Mon (weekday)
Day 2 : Tue (weekday)
Day 3 : Wed (weekday)
Day 4 : Thu (weekday)
Day 5 : Fri (weekday)
Day 6 : Sat (WEEKEND)
Day 7 : Sun (WEEKEND)

8. Bash for vòng lặp sử dụng cú pháp chương trình C

Ví dụ này sử dụng phương thức thứ 2 của vòng lặp bash for, tương tự như cú pháp của vòng lặp C for. Ví dụ sau tạo ra 5 số ngẫu nhiên bằng cách sử dụng vòng lặp for kiểu C bash.

$ cat for8.sh
for (( i=1; i <= 5; i++ ))
do
 echo "Random number $i: $RANDOM"
done

$ ./for8.sh
Random number 1: 23320
Random number 2: 5070
Random number 3: 15202
Random number 4: 23861
Random number 5: 23435

9. Vòng lặp Infinite Bash cho

Khi bạn không cung cấp bắt đầu, điều kiện và số gia trong vòng lặp for kiểu C-style, nó sẽ trở thành vòng lặp vô hạn. Bạn cần nhấn Ctrl-C để dừng vòng lặp.

$ cat for9.sh
i=1;
for (( ; ; ))
do
 sleep $i
 echo "Number: $((i++))"
done

Giống như chúng tôi đã nói ở trên, nhấn Ctrl-C để thoát ra khỏi vô hạn bash này cho ví dụ về vòng lặp.

$ ./for9.sh
Number: 1
Number: 2
Number: 3

10. Sử dụng dấu phẩy trong vòng lặp for kiểu C kiểu bash

Trong vòng lặp bash c-style, ngoài việc tăng giá trị được sử dụng trong điều kiện, bạn cũng có thể tăng một số giá trị khác như được hiển thị bên dưới.

Trong phần khởi tạo và phần gia tăng của vòng lặp for kiểu bash C, bạn có thể có nhiều giá trị bằng cách phân tách bằng dấu phẩy như được hiển thị bên dưới.

Vòng lặp for sau đây được thực hiện tổng cộng 5 lần, sử dụng biến i. Tuy nhiên, biến j bắt đầu bằng 5 và tăng dần 5 mỗi khi vòng lặp được thực thi.

$ cat for10.sh
for ((i=1, j=10; i <= 5 ; i++, j=j+5))
do
 echo "Number $i: $j"
done

$ ./for10.sh
Number 1: 10
Number 2: 15
Number 3: 20
Number 4: 25
Number 5: 30

11. Phạm vi số sau từ khóa “in”

Bạn có thể lặp lại bằng cách sử dụng dải số trong vòng lặp for “in” bằng cách sử dụng mở rộng dấu ngoặc nhọn.

Ví dụ sau lặp lại 10 lần bằng cách sử dụng các giá trị từ 1 đến 10.

$ cat for11.sh
for num in {1..10}
do
 echo "Number: $num"
done

$ ./for11.sh
Number: 1
Number: 2
Number: 3
Number: 4
Number: 5
...

12. Phạm vi số có gia số sau từ khóa “in”

Ví dụ sau lặp lại 5 lần bằng cách sử dụng các giá trị từ 1 đến 10, với gia số là 2. tức là nó bắt đầu bằng 1 và tiếp tục tăng lên 2 cho đến khi đạt đến 10.

$ cat for12.sh
for num in {1..10..2}
do
 echo "Number: $num"
done

$ ./for12.sh
Number: 1
Number: 3
Number: 5
Number: 7
Number: 9

Tái bút: Đừng quên đánh dấu bài viết này để bạn tham khảo trong tương lai.