Viết shell

Màu nền
Font chữ
Font size
Chiều cao dòng

Phần Ì : Getting started with Shell Programming

1.       Viết shell script như thế nào ?

Bước Ì : dùng bất cứ chương trình gì có thể soạn thảo .ví dụ : vi BƯỚC 2 : sau khi viết xong phải gán quyền thực thi cho script Ví dụ :

$ chmod +x tên script

$ chmod 755 tên script Bước 3 : thực thi script Cú pháp :

bash tên script

sh tên script

./ tên script

Cấu trúc một chương trình shell script như sau :

#!/bin/bash                              <- shell mà script sẽ chạy

command ...    <- lệnh command...

exit 0                                        <r thoát

Chú ý: lệnh exit 0 sẽ được mô tả kỹ trong phần Exit status

2.       Biến trong shell

Trong linux shell thì có 2 kiểu biến :

•y   Biến hệ thống (system variable) : được tạo bởi Linux. Kiểu biến này thường được viết bằng ký tự in hoa.

s   Biến do người dùng định nghĩa. Định nghĩa biến : Cú pháp : tên biến=giá trị

Một số quy định về biến trong shell :

(1)    Tên bất đầu bằng ký tự hoặc dấu gạch chân (_).

(2)    Không được có khoang trắng trước và sau dấu bằng khi gán giá trị cho biến

(3)    Biến có phân biệt chữ hoa chữ thường

(4)    Bạn có thể khai báo một biến có giá trị NULL như sau : var01=   hoặc var01='"'

(5)    Không dùng ?, * để đặt tên biến.

3.       Sử dụng biến

Để truy xuất giá trị biến, dùng cú pháp sau :

$tên_biến

ví dụ :

n = lb

echo $n

4.       Lệnh echo

Dùng để hiển thị dòng văn bản, giá trị biến ... Cú pháp : echo [options] [chuôi, biến...] Các option :

-n : không in ký tự xuống dòng.

-e : cho phép hiểu những ký tự theo sau dấu \ trong chuỗi \a : alert (tiếng chuông) \b : backspace \c : không xuống dòng

: xuống dòng \r : về đầu dòng \t : tab \\ : dấu \

ví dụ : echo -e "một hai ba\a\t\t bốn

"

Ì

5. Tính toán trong Shell sư'dung expr

Cú pháp : expr opl phép toán op2

Ví dụ : expr 1 + 3 expr2-1 expr 10/2 expr 20 % 3 expr 10 \* 3 echo " expr 6 + 3"

sư'dung let

Vi'du.:' let "z=$z+3" let "z += 3" let "z=$m*$n"

sư dung $((...))

vi 'du :

z=$((z+3))

z=$(($m*$n))

chú ý :

epxr 20 % 3 : 20 mod 3

epxr 10 \* 3 : phép toán nhân , sự dụng \* chứ không phải * để phân biệt với ký tự thay thế.

Dòng cuối trong ví dụ trên được sử dụng rất nhiều trong shell, khi một lệnh được đặt giữa 2 dấu (không phải dấu nháy đơn " ') thì shell sẽ thực thi lệnh đó. Ví dụ : a = " epxr 10 \* 3"

^ a sẽ có giá trị là10X3 = 30

in kết quả ra màn hình : echo $a

6.  Một vài thông tin vê dấu ngoặc kép

Có 3 loại dấu sau :

Dấu

Tên

Y nghĩa

\\

Nháy kép

bất cứ gì nằm trong dấy nháy kép được xem là những ký tự riêng biêt

1

Nháy đơn

những gì nằm trong dấu nháy đơn có ý nghĩa không đổi

■*

Nháy ngược

thức thi lênh

Ví dụ :

echo "hôm nay là date"     không in được hôm nay là thứ mấy

echo "hôm nay là "date""     sẽ in ra ngày tháng hôm nay vì date nằm trong dấu nháy ngược "

7.     Trạng thái Exit

Mặc định trong Linux, khi một lệnh hoặc script thực thi , nó trả về 2 loại giá trị để xác định xem lệnh hoặc script đó có thực thi thành công không.

(1)   . Nếu giá trị trả về là 0 (zero)    lệnh thực thi thành công

(2)   . Nếu giá trị trả về khác 0 (nonzero)    không thành công

Giá trị đó gọi là Exit status

Vậy làm thế nào để biết được giá trị trả về của một lệnh hay Ì script ? Rất đơn giản, chỉ cần sử dụng biến đặc biệt có sẵn của shell : $? Ví dụ :

nếu bạn xoa Ì file không tồn tại trên đĩa cứng

#    rm unknowfile

#    echo $?    sẽ in ra màn hình một giá trị khác 0

8.     Lệnh read - đọc giá trị nhập từ bàn phím , file ...

Dùng để lấy dữ liệu nhập từ bàn phím và lưu vào biến

Cú pháp : read varl var2 var3 ... varN

read không có tham số -ỳ giá trị sẽ được chứa trong biến $REPLY

ví dụ : read

var="$REPLY"

Bình thường thì dấu \ cho phép xuống dòng để nhập tiếp dữ liệu trong read. Nếu read -r thì sẽ không có ý nghĩa đó. Ví dụ :

#    read var                      # nhập vào : first line \

second line

#    echo "$var"-ỳ kết quả : first line second line Nhưng VỚI tham số r thì sao ?

#    read -r var       # nhập vào : first line \

#    echo "$var" -ỳ kết quả : first line \

Lệnh read có thể dùng để đọc file. Nếu file chứa nhiều hơn Ì dòng thì chỉ có dòng thứ nhất được gán cho biến . Nếu read VỚI nhiều hơn Ì biến (read varl var2 ...) thì read sẽ dựa vào biến $IFS để gán dữ liệu cho các biến. Mặc định thì $IFS là khoảng trắng, vi dụ :

#    read var < data_file

Nếu file có nhiều hơn Ì dòng

#    read varl var2 < data_file

Khi đó, mỗi biến sẽ chứa Ì chuỗi được cách biệt bởi khoảng trắng ($IFS) chứ không phải Ì dòng, biến CUỐI cùng sẽ được chứa toàn bộ phần còn lại của dòng.

Vậy làm thế nào để đọc toàn bộ file ? Có thể giải quyết bằng vòng lặp không ??

while read line do

echo $line done < data_file

Sử dụng $IFS (Internal File Separator) để tách một dòng input của read, nếu bạn không muốn mặc định là khoảng trắng thì làm như thế nào ? Xem đoạn script sau :

echo "Net ke tat ca user "

OIFS=$IFS; IFS=:# backuplại IFSvà gán giá trị mới. vífile /etc/passwd dùng :để tách biệt

# các trường VỚI nhau nên gán IFS là : while read name passwd uid gid fullname ignore do

echo "$name $fullname"

done < /etc/passwd                        # I/O redirection

IFS=$OIFS                      # trả lại IFS ban đầu

Nếu đặt IFS ngay trong vòng lặp thì không cần backup IFS

while IFS=: read name passwd uid gid fullname ignore do

echo "$name $fullname" done < /etc/passwd

IFS vẫn không đổi

9. Tham số lệnh

Giả sử ta có script tên myself, để thực thi script này ta cần truyền vào 2 tham số như sau : $ myself one two

Trong đó

myself là tên script

one : tham số thứ nhất truyền vào script two : tham số thứ hai

Trong shell, bạn truy xuất đến những tham số như sau : myself là $0 one là $1 two là $2

Và biến $# (có sẵn trong shell) sẽ cho giá trị 2 (có 2 tham số one và two). Bạn có thể lấy tất cả các tham số bằng cách sử dụng biến $@ hoặc $*

10.   Redirection

Hầu hết tất cả lệnh đều cho xuất kết quả ra màn hình hoặc lầy dữ liệu từ bàn phím nhưng VỚI Linux bạn còn có thể xuất dữ liệu vào file và đọc dữ liệu từ file.

Ví dụ :

Is > filename # in kết quả lệnh Is vào file có tên filename. Có 3 ký hiệu redirection là >, >> và <

(1)   . Ký hiệu >

cú pháp : linux-command > filename

Xuất output của lệnh ra file. Nếu file tồn tại thì nó sẽ ghi đè còn nếu file chưa có thì tạo file mới

(2)   . Ký hiệu >>

cú pháp : linux-command >> filename

Xuất output của lệnh vào CUỐIfile nếu file đã tồn tại, còn nếu file chưa tồn tại thì tạo file mới.

(3)   . Ký hiệu <

cú pháp : linux-command < filename

lấy dữ liệu cho linux-command từ filename thay vì từ bàn fím.

11.   Pipe

Cú pháp : command ÌI command 2

Output của command Ì sẽ là dữ liệu vào của command 2 Ví dụ :

$whoIgrep root

2.  Điêù kiên if :

Cu pháp :

if condition then

command command

Phân 2 : Câu true Shell

fi

Trong đo': condition la true hoác exit status cua lênh la'O (zero) thPthưc hiên command Vi 'du.: gia sư'đa~co 'file tên la'foo $ cat foo

$ echo $?  # $? La lây exit status cua lênh cat

nêu lênh cat tra Vê"0 ( zero )-ỳ thanh công . shell script đước viêt như sau :

#!/bin/bash

if cat $1 then

echo -e "

File $1 , tim thây va "in ra thanh công "

fi

exit 0

3.   Lênh test hay câu true [ biêủ thức ]

Lênh test hoác câu true [ biêu thức ] dung đếkiêm tra Ì biêu thức la "đung hay sai, nêu đung tra

vếo, ngước lai.la^sốkhac 0

Cu pháp : test biêu thức HOÁC [ biêu thức ]

Biêu thức kiêm tra lam viêc vơi

(1)  

. Sô'nguyên

(2)  . Nhưng kiêu file

(3)   . Chuôi

Toan tư'

Y'nghía

Sô Tioc

If trong shell

trong shell

script

Lênh test

[ biêu thức ]

-eq

So sanh băng

5 == 6

If test 5 -eq 6

If [5 -eq 6 ]

-ne

Không băng

5!=6

If test 5 -ne 6

If [ 5 -ne 6 ]

-It

Nho hơn

5<6

If test 5 -It 6

If r 5 -It 6 1

-le

Nho hơn hay băng

5<=6

If test 5-le6

If r 5-le6 1

-qt

Lơn hơn

5>6

If test 5 -gt 6

If [ 5 -qt 6 ]

-qe

Lơn hơn hoác băng

5> = 6

If test 5 -qe 6

If r 5 -qe 6 1

Bạn đang đọc truyện trên: Truyen2U.Pro