Bắt đầu với Lập trình Shell
Mặc dù chúng ta đã quá quen với shell script. Nhưng sau đây, tôi vẫn muốn giới thiệu về cách để viết 1 shell script cho những bạn đang cần nó.
1. Viết shell script như thế nào ?
Bước 1: dùng bất cứ chương trình gì có thể soạn thảo . Ví dụ: vi
- Bạn nên dùng gedit để viết shell vì khi viết shell nó sẽ hiện màu sắc phân biệt giữa các kí tự và các từ khoá giúp bạn dễ kiểm soát lỗi. Bước 2: sau khi viết xong phải gán quyền thực thi cho script Ví dụ:
$ chmod u+x 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 <- 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:
- 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.
- 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ó khoảng 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=10
echo $n
- 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
\n: 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 \n"
5. Tính toán trong Shell
Sử dụng expr Cú pháp:
expr op1 phép toán op2
Ví dụ:expr 1 \+ 3
expr 2 \– 1
expr 10 \/ 2
expr 20 \% 3
expr 10 \* 3
echo `expr 6 \+ 3`
z=`epxr $z \+ 3`
Sử dụng
let
Ví dụ:let "z=$z+3"
let "z += 3"
let "z=$m*$n"
Sử dụng
$((…))
ví dụ: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à 10 x 3 = 30 in kết quả ra màn hình: echo $a6. Một vài thông tin về dấu ngoặc kép
Có 3 loại dấu sau: Code: ": 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 ‘: 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 1 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 xoá 1 file không tồn tạI trên đĩa cứngrm 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 var1 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 lineecho "$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 1 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 1 biến (read var1 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. Ví dụ: read var < data_file
Nếu file có nhiều hơn 1 dòng read var1 var2 < data_file
Khi đó, mỗI biến sẽ chứa 1 chuỗI được cách biệt bởI khoảng trắng ($IFS) chứ không phảI 1 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 "liet ke tat ca user "
OIFS=$IFS; IFS=: # backup lạI IFS và 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ụ:
ls > filename # in kết quả lệnh ls 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ốI file 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 1 | command 2
Output của command 1 sẽ là dữ liệu vào của command 2 Ví dụ: $who | grep root
Kết
Trên đây là một số cú pháp cơ bản, mong có thể giúp được các bạn, không ít thì nhiều
Hướng dẫn viêt chương trình Shell Script Linux
1. Khái niệm cơ bản về Bash Script:
Trong những ngày đầu, máy tính chỉ hiểu được ngôn ngữ nhị phân, đó là điều khó khăn đối với người dùng và cả những nhà phát triển. Theo nhu cầu đó,một chương trình đặc biệt ra đời, nó được gọi là Shell. Shell chấp nhận các câu lệnh tiếng Anh, theo một cú pháp cho trước và chuyển nó đển Kernel để xử lý tiếp, sau đó trả lại kết quả cho người dùng. Shell là chương trình để tương tác giữa người dùng và máy tính. Thông dịch các lệnh của người dùng nhập vào hoặc từ các file. Shell không phải là một phần của hạt nhân hệ thống, nhưng nó dùng hạn nhân để thực thi các chương trình, tạo ra các tập tin… Các loại Shell Script: Một số Shell có sẵn trên Linux:
Trong MS-DOS, Shell là được cọi là COMMAND.COM, cũng được sử dụng cho mục đích tương tự, nhưng không mạnh mẽ bằng Shell Linux. Tất cả các loại Shell phía trên đều đọc các lệnh người dùng nhập và đưa đến Linux OS để nói với OS rằng người dùng đang muốn gì. Các dòng lệnh được gọi là command line. Để xem system đang chạy shell gì, bạn có thể dùng lệnh #echo $SHELL Hello World script: Đến đây, để khỏi nhàm chán, chúng ta cùng làm 1 bài đơn giản nhất, nhập môn của bất kỳ ngôn ngử nào. Hello World. Tạo 1 file tên là hello_world.sh, nội dung như sau: #!/bin/bash
#chmod 755 hello_world.shChạy file: sh hello_world.sh 2. Một số ví dụ đơn giản sẽ giúp các bạn làm quen dần với Bash Shell Script, viết được một số ứng dụng cơ bản cho mình. Backup thư mục đơn giản: #!/bin/bashĐoạn script trên giúp ta nén lại thư mục /home/www thành file www.tar.gz, như thế ta đã có một bản backup của thư mục này. Biến: Variables Cùng xem qua lại ví dụ Hello World đã làm ở trên để xem kỹ hơn về biến, khai báo biến: #!/bin/bashVậy hãy cũng làm lại script Backup phía trên, trong đó có khai báo biến. #!/bin/bash Làm ví dụ sau: #!/bin/bashKết quả sẽ tra về: global variableĐối số cho Bash Script: Passing arguments to the bash script #!/bin/bashKết quả: Bash Shell Script -> echo $1 $2 $3Thực thi lệnh với Bash: Executing shell commands with bash #!/bin/bashKết quả: GNU/LinuxĐọc dữ liệu đầu vào: Reading User Input #!/bin/bashBash Trap Command Phần này sẽ là một ví dụ thực thi lệnh khi dữ liệu đầu vào là tổ hợp phím CTRL+C. #!/bin/bashKết quả khi chạy Bash file: Debian LinuxNhư vậy nếu không đặt phần tử mảng trong “ thì mặc định các phần tử được cắt ra bởi khoảng trắng (space) Mảng: Array #!/bin/bashKết quả trả về : Debian LinuxNhư vậy, nếu không khai báo phần tử mảng trong “ thì mặc định các phần tử được xác định bởi khoảng trắng (space). Điều kiện If / Else: Bash if / else / fi statements #!/bin/bashLưu ý có khoảng trắng giữa [ và ] , nếu không thì bash sẽ không chạy được do sai cú pháp. Mở đầu bằngif và kết thúc bằng fi. Các điều kiện If / else có thể lồng vào nhau: Nested if/else #!/bin/bashCũng như các ngôn ngữ lập trình, trong Bash Shell Script cũng có các phép toán so sánh. Nó có khả năng so sánh, đối chiếu toán tử và các chuỗi. Hãy cùng xem qua các ví dụ chi tiết của từng phần sau. So sánh toán tử: Arithmetic Comparisons
#!/bin/bashKết quả khi chạy bash sẽ được: Both Values are equal vì cả hai biến NUM1 và NUM2 đều có giá trị như nhau, đều = 2. So sánh chuỗi: String Comparisons
>#!/bin/bashkết quả nhận được sẽ là: Strings are NOT equal vì hai chuỗi ký tự hoàn toàn khác nhau. Kiểm tra file trong Bash: Bash File Testing
#!/bin/bashVí dụ 2: Chờ đến khi file được khởi tạo hoặc tồn tại thì thoát script. #!/bin/bashVòng lặp FOR Thể hiện danh sách các file trong folder định sẵn: # !/bin/bashHoặc bạn cũng có thể chạy dưới dạng command line: # for f in $( ls /var/ ); do echo $f; doneVòng lặp WHILE Đoạn code mẫu ví dụ trong vòng lặp while: #!/bin/bashMã trên sẽ thể hiện ra màn hình từ 6 giảm dần về đến 1. Vòng lặp UNTIL Ví dụ mẫu về vòng lặp until: #!/bin/bashNgược lại với ví dụ về while. Vòng lặp until phía trên sẽ thể hiện ra màn hình tăng dần từ 1 đến 5. Viết Function trong bash shell script Cũng như các ngôn ngữ khác, bash shell cũng hỗ trợ function, chúng ta cùng xem qua cách viết và sử dụng trong ví dụ bên dưới: !/bin/bashBash Select #!/bin/bashBash select cho phép người dùng lựa chọn các option để đưa vào chương trình. Từ đó server cũng có thể lấy được giá trị người dùng vừa nhập để có thể chọn thuật toán xử lý chính xác. Bash shell script backup MySQL database trên server Linux Nếu ai đang sử dụng các dịch vụ VPS, Dedicated Server dùng cho nhu cầu Webserver hoặc các ứng dụng đang chạy trên nền tảng Linux và hệ cơ sở dữ liệu MySQL thì đây có thể là 1 đọan shell hữu dụng. Nó phục vụ nhu cầu thực tế là backup và lưu trữ các file backup của MySQL dưới dạng tenfile_ngay_thang_nam.sql (Tên file, ngày, tháng, năm đã backup cơ sở dữ liệu này). Tất nhiên để có thể hoàn chỉnh một công cụ backup, bạn cần phải thêm cho nó một số tính năng nữa như là upload file backup nào sang lưu trữ chỗ khác, thông qua giao thức FTP chẳng hạn, cấu hình hẹn giờ để backup…Nhưng có lẽ việc khởi đầu không thông qua bài “hello world” đã là khó khăn rồi.Chúng tôi chỉ dừng lại ở chức năng backup database MySQL và đưa file backup đó ra thư mục cấu hình sẵn mà thôi. Tạo thư mục scripts, sau đó tạo file backup-database với nội dung như sau: #!/bin/bashQuá đơn giản phải không?
sh /scripts/backup-databaseNếu bạn thấy thông báo Backup Finished có nghĩa là đã thành công, có thể vào thư mục /backup/database để kiểm tra thành quả.Ngoài ra, bạn cũng có thể kết hợp với crontab để cho backup được chạy tự động. ****** Nguồn bài viết http://www.gocit.vn/bai-viet/bash-shell-script/ ***** |
Không có nhận xét nào:
Đăng nhận xét