Vòng lặp trong Unix/Linux

Vòng lặp là công cụ chương trình có tính năng mạnh, cho phép bạn có thể lặp lại một tập hợp các lệnh. Trong chương này, bạn sẽ tìm hiểu qua các ví dụ thực hành về vòng lặp có trong các chương trình shell.

Các loại vòng lặp trong Shell

Vòng lặp while trong Shell

Vòng lặp while cho bạn khả năng thực thi một tập hợp các lệnh lặp đi lặp lại cho tới khi một số điều kiện xảy ra. Nó thường được sử dụng khi bạn cần thao tác giá trị biến lặp đi lặp lại.

Cú pháp trong Unix/Linux

while command
do
   cac lenh de thuc thi neu command la true
done

Ở đây, command được ước lượng. Nếu giá trị kết quả là true, các lệnh được thực thi. Nếu command là false, thì sau đó, các statement(s) sẽ không được thực hiện và chương trình sẽ nhảy tới dòng lệnh sau lệnh done.

Ví dụ trong Unix/Linux

Dưới đây là một ví dụ đơn giản mà sử dụng vòng lặp while để hiển thị các số từ 0 đến 9.

#!/bin/sh
a=0
while [ $a -lt 10 ]
do
   echo $a
   a=`expr $a + 1`
done

Nó sẽ cho kết quả sau:

0
1
2
3
4
5
6
7
8
9

Vòng lặp for trong Shell

Vòng lặp for hoạt động trên các danh sách của các mục (item). Nó lặp đi lặp lại một tập hợp các lệnh cho mỗi mục trong một danh sách.

Cú pháp trong Unix/Linux

for var in word1 word2 ... wordN
do
   cac lenh de thuc thi cho moi word.
done

Ở đây, var là tên của một biến và word1 tới wordN là dãy các ký tự phân biệt nhau bởi các khoảng trống. Cứ mỗi lần vòng lặp thực thi, giá trị của biến var được thiết lập tới word tiếp theo trong danh sách các word, từ word1 tới wordN.

Ví dụ trong Unix/Linux Dưới đây là ví dụ đơn giản mà sử dụng vòng lặp for để duyệt qua danh sách các số.

#!/bin/sh
for var in 0 1 2 3 4 5 6 7 8 9
do
   echo $var
done

Nó sẽ cho kết quả sau:

0
1
2
3
4
5
6
7
8
9

Vòng lặp until trong Shell

Vòng lặp while là hoàn hảo cho tình huống mà bạn muốn thực thi một tập hợp lệnh trong khi một số điều kiện là true. Đôi khi bạn cần thực thi một tập hợp các lệnh cho tới khi một điều kiện là true, khi đó bạn cần sử dụng vòng lặp until.

Cú pháp trong Unix/Linux

until command
do
   cac lenh duoc thuc thi toi khi command la true
done

Ở đây command được ước lượng. Nếu giá trị kết quả là false, thì lệnh được thực thi. Nếu command là true, thì khi đó các lệnh sẽ không được thực hiện và chương trình sẽ nhảy tới dòng lệnh sau lệnh done.

Ví dụ trong Unix/Linux Ở là một ví dụ đơn giản mà sử dụng vòng lặp until để hiển thị các số từ 0 đến 9.

#!/bin/sh
a=0
until [ ! $a -lt 10 ]
do
   echo $a
   a=`expr $a + 1`
done

Nó sẽ cho kết quả sau:

0
1
2
3
4
5
6
7
8
9

Vòng lặp select trong Shell

Vòng lặp select cung cấp một cách dễ dàng để tạo một menu được đánh số từ đó người sử dụng có thể chọn lựa. Nó là hữu ích khi bạn muốn hỏi người sử dụng để chọn một hoặc nhiều mục từ một danh sách các lựa chọn.

Cú pháp trong Unix/Linux

select var in word1 word2 ... wordN
do
   cac lenh de thuc thi cho moi word.
done

Ở đây, var là tên một biến và word1 tới wordN là dãy các ký tự phân biệt nhau bởi khoảng trống. Cứ mỗi lần vòng lặp thực thi, giá trị biến var được thiết lập tới word tiếp theo trong danh sách các word, từ word1 tới wordN.

Đối với mỗi lựa chọn, một tập hợp các lệnh sẽ được thực thi bên trong vòng lặp. Vòng lặp này được giới thiệu trong ksh và đã được điều chỉnh vào trong bash. Nó là không có sẵn trong sh.

Ví dụ trong Unix/Linux

Ví dụ đơn giản dưới đây cho người sử dụng chọn một đồ uống trong danh sách các đồ uống.

#!/bin/ksh
select DRINK in tea cofee water juice appe all none
do
   case $DRINK in
      tea|cofee|water|all) 
         echo "Go to canteen"
         ;;
      juice|appe)
         echo "Available at home"
      ;;
      none) 
         break 
      ;;
      *) echo "ERROR: Invalid selection" 
      ;;
   esac
done

Menu được hiển thị bởi vòng lặp select trông như sau:

$./test.sh
1) tea
2) cofee
3) water
4) juice
5) appe
6) all
7) none
#? juice
Available at home
#? none
$

Bạn có thể thay đổi dòng nhắc được hiển thị bởi vòng lặp select bởi thay đổi biến PS3 như sau:

$PS3="Please make a selection => " ; export PS3
$./test.sh
1) tea
2) cofee
3) water
4) juice
5) appe
6) all
7) none
Please make a selection => juice
Available at home
Please make a selection => none
$

Bạn sẽ sử dụng các vòng lặp khác nhau trên cơ sở các tình huống khác nhau. Ví dụ, vòng lặp while sẽ chạy lệnh đã cho tới khi điều kiện đã cho vẫn còn đúng, trong khi đó vòng lặp until sẽ chạy tới khi điều kiện đã cho trở nên đúng.

Một khi bạn có các bài thực hành chương trình tốt, bạn sẽ bắt đầu sử dụng vòng lặp thích hợp trên cơ sở tình huống đã cho. Ở đây, vòng lặp while và for là có sẵn trong hầu hết các ngôn ngữ chương trình khác như C, C++ và PERL etc.

Lồng các vòng lặp trong Unix/Linux

Tất cả các vòng lặp hỗ trợ khái niệm lồng, có nghĩa là bạn có thể đặt một vòng lặp vào bên trong một vòng lặp tương tự hoặc các vòng lặp khác. Việc lồng này có thể không giới hạn số lượng tối đa vòng lặp, nó phụ thuộc vào yêu cầu của bạn.

Dưới đây là ví dụ của lồng vòng lặp while, và theo cách tương tự, các vòng lặp khác có thể được lồng tùy theo yêu cầu chương trình.

Lồng vòng lặp while trong Unix/Linux

Nó là có thể để sử dụng vòng lặp while như là một phần của thân của một vòng lặp while khác.

Cú pháp:

while command1 ; # Day la vong lap thu nhat, la vong lap ben ngoai
do
   Cac lenh de thuc thi neu command1 la true


   while command2 ; # Day la vong lap thu hai, la vong lap ben trong
   do
      Cac lenh de thuc thi neu command2 la true
   done


   Cac lenh de thuc thi neu command1 la true
done

Ví dụ:

Sau đây là ví dụ đơn giản của lồng vòng lặp:

#!/bin/sh
a=0
while [ "$a" -lt 10 ]    # this is loop1
do
   b="$a"
   while [ "$b" -ge 0 ]  # this is loop2
   do
      echo -n "$b "
      b=`expr $b - 1`
   done
   echo
   a=`expr $a + 1`
done

Nó tạo ra kết quả sau. Nó là quan trọng để ghi nhớ cách echo -n làm việc ở đây. Tại đây tùy chọn -n cho phép echo tránh việc in một dòng ký tự mới.

0
1 0
2 1 0
3 2 1 0
4 3 2 1 0
5 4 3 2 1 0
6 5 4 3 2 1 0
7 6 5 4 3 2 1 0
8 7 6 5 4 3 2 1 0
9 8 7 6 5 4 3 2 1 0

Bình luận