RSS

Lập trình shell trong linux

Dưới đây là bài viết rất hay mình đọc được trên http://nguyenvcuong.blogspot.com:

[Shell script] Các câu lệnh điều kiện, rẽ nhánh-Condition

Các câu lệnh được sử dụng cho việc rẽ nhánh, điều kiện như if-then, test, hoặc cặp dấu [ expr ]. Phần này sẽ tìm hiểu cách shell làm việc với những thứ như vậy.

1.If-then  

Câu lệnh if-then đc sử dụng để tạo nên việc đánh giá điều điện nào đó. Cú pháp:

if condition
then
commands

fi

Ý nghĩa: với if-then trên, trước tiên sẽ đánh giá condition, nếu condition thực thi thành công(exit status code=0) thì sẽ thực hiện các commands sau then.

Ví dụ:
Ta có đoạn script:

Thực thi:

Ở trên, biến testuser đc gán là Cuong.bắt đầu mệnh đề if, câu lệnh grep sẽ tìm xem trong file /etc/passwd có chuỗi nào có tên là Cuong hay ko, nếu trùng tức là câu lệnh đc thực hiện thành công, exit status code là 0. Lúc này, các câu lệnh theo sau then sẽ đc thực thi, liệt kê toàn bộ những file bash của testuser
Ngoài ra còn có thể đặt theo kiểu

if command; then
commands
fi

2.if-then-else

Với mệnh đề if-then ở trên, ta chỉ có 1 lựa chọn cho việc đánh giá. Mệnh đề if-then-else cung cấp một cách so sánh khác. Cho phép ta có nhiều lựa chọn hơn cho việc so sánh.

Cú pháp:

if command
then
commands
else
commands
fi

Nếu command trong câu lệnh if đầu tiên, trả về một exit status code là 0(zero), thì những commands ngay sau then sẽ đc thực thi tương tự như if-then. Nhưng nếu command trên if ko trả về 0, thì các commands phía sau else sẽ đc thực thi.

Thực thi:

3.Câu lệnh test hoặc cặp dấu [ expr ]

Cả 2 Câu lệnh thường đc sử dụng để kiểm tra định dạng file hoặc so sánh các giá trị. Thường thì đc sử dụng cho việc:

  1. -So sánh các thuộc tính của file
  2. -Thực hiện việc so sánh các chuỗi
  3. -So sánh toán học

Cú pháp:

test condition

condition là một loạt các tham số và giá trị đc test thực hiện. Nếu sử dụng với if-then thì sẽ tương tự như vầy:

if test condition
then
commands
fi

hoặc

if [ condition ]
then
commands
fi

***Lưu ý khoảng trắng của condition

So sánh số:

So sánh string:

So sánh thuộc tính của file:

Một số phép so sánh trong shell:

-eq   ngang bằng
-ne  không ngang bằng
-lt  nhỏ hơn
-le nhỏ hơn hoặc bằng
-gt  lớn hơn
-ge  lớn hơn hoặc bằng

Một số phép xử lý thuộc tính file:

-s  file tồn tại và khác rỗng(NULL)
-f  file tồn tại và ko phải là thư mục
-d  thư mục tồn tại
-x  file có thể thực thi
-w  file có thể ghi
-r  file có thể đọc

Làm việc với string:

Operator Meaning
string1 = string2  string1 ngang bằng string2
string1 != string2 string1 khác  string2
string1 string1 ko rỗng hoặc ko đc định nghĩa
-n string1 string1 tồn tại và không rỗng
-z string1 string1 tồn tại nhưng rỗng

Phép toán logic:

Operator            Meaning
! expression phép NOT
expression1  -a  expression2 phép  AND
expression1  -o  expression2 phép  OR

[Shell script] Biểu thức toán học- Math

Trong shell, có 3 cách để thực thi các biểu thức toán học:

1.Sử dụng câu lệnh expr

Câu lệnh expr cho phép tính toán từ command line. Ví dụ:

$ expr 1 + 3
4

Lưu ý, phải có khoảng trắng giữa toán tử và toán hạng. Nếu ở trên đổi thành 1+3 hoặc 1+ 3 hoặc 1 +3, thì đều cho kết quả hoặc có thông báo sai.

Các phép toán như cộng, trừ, nhân, chia có thể đc sử dụng. Nhưng có một điểm cần lưu ý với phép toán nhân(*). Trong linux, ký tự * là một ký tự khá đặc biệt, nó là ký tự đại diện cho toàn bộ một nhóm ký tự, đối tượng nào đó. Nếu sử dụng phép toán a * b trong shell, sẽ có thông báo lỗi. Thay vào đó ta phải sử dụng cú pháp: a \* b. Khi đó, phép toán sẽ đc thực hiện.

Ví dụ về 1 script:

#!/bin/bash
# An example of using the expr command
var1=10
var2=20
var3=`expr $var2 / $var1`
echo The result is $var3

Script trên mô tả về việc lưu một giá trị của một biểu thức vào một biến. Muốn làm được điều này, ta phải sử dụng ký tự gọi là backtick(`).

2.Sử dụng ký tự bracket(dấu ngoặc vuông)

Shell còn cung cấp cho ta một cách để thực hiện các phép toán. Để gán giá trị cho một biến, có thể sử dụng cú pháp sau:

    $[operation]

Ví dụ:

    $ var1 = $[1 + 3]

Lúc này, var1 sẽ nhận giá trị là 4.
Khi đã sử dụng ký tự bracket, thì phép toán * đã nói ở trên trở thành hợp lệ

    $ var2 = $[var1 * 3]
$ echo var2
12

Hạn chế của việc sử dụng bracket này đó là nó chỉ hỗ trợ phép tính số nguyên-integer

#!/bin/bash
var1=100
var2=45
var3=$[$var1 / $var2]
echo The final result is $var3

khi chạy script trên, nó sẽ in ra kết quả là 2.
Đây là hạn chế chính của việc sử dụng bracket trong tính toán

3. Sử dụng bc-bash calculator
Đây là một ngôn ngữ cho phép ta nhập các số float vào trong bash shell. bc có thể nhận dạng và xử lý:

-các số (cả integer và float)
-biến
-comment dùng để diễn giải đoạn code( /* */)
-Expression-các biểu thức
-Các statement (ví dụ if -then)
-Các hàm

3.1.Đưa bc vào trong script

Ta có thể đưa bc vào trong srcipt để tính toán. Cú pháp:

variable=`echo “options; expression” | bc`

variable: tên biến
options: các tùy chọn
expression:biểu thức

Với cú pháp trên, ta đã đưa kết quả của expression vào biến variable.

Ở trong script trên, scale cho biết số lượng số sau dấu chấm.

[Shell script] Vòng lặp

TRong bash shell cũng cung cấp cho ta 3 kiểu loop:
-for
-while
-until
Phần 1 sẽ nói về vòng lặp for

TRong mỗi kiểu loop đều thực thi theo trình tự:

  1. 1. Trước tiên, biến đc sử dụng trong điều kiện lặp phải được gán, sau đó vòng lặp bắt đầu
  2. 2. Một điều kiện đc sinh ra trong mỗi lần bắt đầu lặp
  3. 3. Thân vòng lặp sẽ kết thúc với 1 statement chỉnh sửa giá trị của biến kiểm tra

Vòng lặp for có thể sử dụng dưới 2 dạng:
-Dạng thứ nhất:

            for { variable name } in { list }
do
execute one for each item in the list until the list is
not finished (And repeat all statement between do and done)
done

variable name: tên biến đc sử dụng
list: các giá trị mà biến sẽ nhận
trong “do … done” sẽ là những câu lệnh bash đc thực thi.

Các ví dụ:
-Đọc giá trị từ 1 list

***Lưu ý khi sử dụng các dấu quote trong khi đọc các giá trị. Nên đặt vào trong cặp dấu “”

-Đọc list từ biến

-Đọc giá trị từ 1 câu lệnh

**Lưu ý, mỗi biến phải đc đặt ở một dòng riêng, ko phải phân biệt qua khoảng cách

-Đọc tất cả các files trong một thư mục

-Dạng thứ 2 của vòng lặp for

for (( variable assignment ; condition ; iteration process ))

do
…..

repeat all statements between do and
done until condition is TRUE
done

Ví du:

-Sử dụng nhiều biến cùng lúc

[Shell script] Vòng lặp

Ở phần trước đã nói về vòng lặp với for, ở phần này sẽ tìm hiểu vòng lặp với while và until

—-While command—–

Câu lệnh while cũng đc sử dụng để tạo nên một vòng lặp.

Cú pháp:

           while [ condition ]
do
command1
command2
command3
..
….
done

Vòng lặp sẽ đc thực thi khi giá trị của condition là true. Cần phải lưu ý về điều kiện dừng của vòng lặp

vd: ĐOạn script sau sẽ yêu cầu ta nhập vào một số, nếu đúng với biến đã định
trước thì sẽ thông báo đoán đúng, nếu sai yêu cầu nhập tiếp:

—–Until command——


Cú pháp lệnh:

until [ condition ]
do
command1
command2

….
commandN
done

Until làm việc trái ngược hẳn so với while. Các biểu thức xác định độ dừng(condition) phải trả về một exit status khác 0. Có nghĩa là, khi điều kiện dừng trả về exit status code khác 0, vòng lặp tiếp tục được thực hiện. Khi status code bằng 0, lúc đó vòng lặp sẽ dừng.

Đoạn script sau sử dụng vòng lặp với until: