Lập trình Bash Shell Script

GIT – Góc IT gởi đến các bạn loạt bài viết tổng hợp Script từ căn bản đến nâng cao để giới thiệu đến mọi người. Chúng ta hãy cũng làm các ví dụ đơn giản để hiểu thêm, và nắm chắc hơn trước khi đi đến những bài học nâng cao hơn.

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 :

  • BASH ( Bourne-Again SHell ) phát triển bởi Brian Fox và Chet Ramey. Đây là Shell thông dụng nhất trên Linux.
  • CSH (C SHell) phát triển bởi Bill Joy tại University of California (dành cho BSD). Sử dụng cấu trúc lệnh giống C, rất thân thiện cho các lập trình viên C trên linux.
  • KSH (Korn SHell) phát triển bởi David Korn tại AT & T Bell Labs.
  • TCSH bạn có thể gọ lệnh #man tcsh để xem thông tin.

Để xem hệ thống của bạn hỗ trợ những loại shell nào, có thể dùng lệnh #cat /etc/shells. Mỗi loại shell có cú pháp, cách dùng khác nhau, cung cấp cho bạn các chức năng khác nhau.

Trong MS-DOS, Shell là được cọi là .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
# declare STRING variable
STRING=”Hello World”
#print variable on a screen
echo $STRING

Dòng đầu tiên chúng ta luôn đặt #!/bin/bash, đây là cú pháp bắt buộc. Sau # được hiểu là comment, chú thích của các đoạn mã.

  • STRING=”Hello World” // Khai báo biến STRING.
  • echo $STRING // Hiển thị biến STRING ra màn hình.

Lưu file lại, tiến hành chmod cho file:

#chmod 755 hello_world.sh

Chạy file:

sh hello_world.sh

Kết quả sẽ nhận về là : Hello World

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
tar -czf www.tar.gz /home/www

Đ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/bash
STRING=”Hello World”
echo $STRING

Vậy hãy cũng làm lại script Backup phía trên, trong đó có khai báo biến.

#!/bin/bash
OF=www_$(date +%Y%m%d).tar.gz
tar -czf $OF /home/www

Biến toàn cục và cục bộ: Global vs. Local variables

Làm ví dụ sau:

#!/bin/bash
#Define bash global variable
#This variable is global and can be used anywhere in this bash script
VAR=”global variable”
function bash {
#Define bash local variable
#This variable is local to bash function only
local VAR=”local variable”
echo $VAR
}
echo $VAR
bash
# Note the bash global variable did not change
# “local” is bash reserved word
echo $VAR

Kết quả sẽ tra về:

global variable
local variable
global variable

Đối số cho Bash Script: Passing arguments to the bash script

#!/bin/bash
# use predefined variables to access passed arguments
#echo arguments to the shell
echo $1 $2 $3 ‘ -> echo $1 $2 $3’
# We can also store arguments from bash <a title=”See the tag: command (5 posts)” class=”autobesttag” rel=”nofollow” href=”http://gocit.vn/command/”>command</a> line in special array
args=(“$@”)
#echo arguments to the shell
echo ${args[0] } ${args[1] } ${args[2] } ‘ -> args=(“$@”); echo ${args[0] } ${args[1] } ${args[2]

}’
#use $@ to print out all arguments at once
echo $@ ‘ -> echo $@’
# use $# variable to print out
# number of arguments passed to the bash script
echo Number of arguments passed: $# ‘ -> echo Number of arguments passed: $#’

Kết quả:

Bash Shell Script -> echo $1 $2 $3
Bash Shell Script -> args=(“$@”); echo ${args[0] } ${args[1] } ${args[2]

}
Bash Shell Script -> echo $@
Number of arguments passed: 3 -> echo Number of arguments passed: $#

Thực thi lệnh với Bash: Executing shell commands with bash

#!/bin/bash
# use backticks ” ` ` ” to execute shell command
echo `uname -o`
# executing bash command without backticks
echo uname -o

Kết quả:

GNU/Linux
uname -o

Đọc dữ liệu đầu vào: Reading User Input

#!/bin/bash
echo -e “Hi, please type the word: \c ”
read word
echo “The word you entered is: $word”
echo -e “Can you please enter two words? ”
read word1 word2
echo “Here is your input: \”$word1\” \”$word2\””
echo -e “How do you feel about bash scripting? ”
# read command now stores a reply into the default build-in variable $REPLY
read
echo “You said $REPLY, I’m glad to hear that! ”
echo -e “What are your favorite colours ? ”
# -a makes read command to read into an array
read -a colours
echo “My favorite colours are also ${colours[0] }, ${colours[1] } and ${colours[2] }:-)”

Bash 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/bash
# bash trap command
trap bashtrap INT
# bash clear screen command
clear;
# bash trap function is executed when CTRL-C is pressed:
# bash prints message =&gt; Executing bash trap subrutine !
bashtrap()
{
echo “CTRL+C Detected !…executing bash trap !”
}
# for loop from 1/10 to 10/10
for a in `seq 1 10`; do
echo “$a/10 to Exit.”
sleep 1;
done
echo “Exit Bash Trap Example!!!”

Kết quả khi chạy Bash file:

Debian Linux
Redhat Linux
Ubuntu
Linux

Như 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/bash
#Declare array with 4 elements
ARRAY=( ‘Debian Linux’ ‘<a title=”See the tag: redhat (2 posts)” class=”autobesttag” rel=”nofollow” href=”http://gocit.vn/centos/”>Centos</a> Linux’ <a title=”See the tag: ubuntu (4 posts)” class=”autobesttag” rel=”nofollow” href=”http://gocit.vn/ubuntu/”>Ubuntu</a> Linux )
# get number of elements in the array
ELEMENTS=${#ARRAY[@]

}
# echo each element in array
# for loop
for (( i=0;i&lt;$ELEMENTS;i++)); do
echo ${ARRAY[${i}]
}
done

Kết quả trả về :

Debian Linux
Redhat Linux
Ubuntu
Linux

Như 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/bash
directory=”./BashScripting”
# bash check if directory exists
if [ -d $directory ]

; then
echo “Directory exists”
else
echo “Directory does not exists”
fi

Lư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/bash
# Declare variable choice and assign value 4
choice=4
# Print to stdout
echo “1. Bash”
echo “2. Scripting”
echo “3. Tutorial”
echo -n “Please choose a word [1,2 or 3]

? ”
# Loop while the variable choice is equal 4
# bash while loop
while [ $choice -eq 4 ]

; do
# read user input
read choice
# bash nested if/else
if [ $choice -eq 1 ]

; then

echo “You have chosen word: Bash”
else
if [ $choice -eq 2 ]

; then
echo “You have chosen word: Scripting”
else
if [ $choice -eq 3 ]

; then
echo “You have chosen word: Tutorial”
else
echo “Please make a choice between 1-3 !”
echo “1. Bash”
echo “2. Scripting”
echo “3. Tutorial”
echo -n “Please choose a word [1,2 or 3]

? ”
choice=4
fi
fi
fi
done

Cũ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

-lt <
-gt >
-le <=
-ge >=
-eq ==
-ne !=

Ví dụ cho phép so sánh toán tử:

#!/bin/bash
# declare integers
NUM1=2
NUM2=2
if [ $NUM1 -eq $NUM2 ]

; then
echo “Both Values are equal”
else
echo “Values are NOT equal”
fi

Kế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

= equal
!= not equal
< less then
> greater then
-n s1 string s1 is not empty
-z s1 string s1 is empty

Ví dụ minh họa:

>#!/bin/bash
#Declare string S1
S1=”Bash”
#Declare string S2
S2=”Scripting”
if [ $S1 = $S2 ]

; then
echo “Both Strings are equal”
else
echo “Strings are NOT equal”
fi

kế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

-b filename Block special file
-c filename Special character file
-d directoryname Check for directory existence
-e filename Check for file existence
-f filename Check for regular file existence not a directory
-G filename Check if file exists and is owned by effective group ID.
-g filename true if file exists and is set-group-id.
-k filename Sticky bit
-L filename Symbolic link
-O filename True if file exists and is owned by the effective user id.
-r filename Check if file is a readable
-S filename Check if file is socket
-s filename Check if file is nonzero size
-u filename Check if file set-ser-id bit is set
-w filename Check if file is writable
-x filename Check if file is executable

Ví dụ 1: Kiểm tra và thông báo file có tồn tại hay không.

#!/bin/bash
file=”./file”
if [ -e $file ]

; then
echo “File exists”
else
echo “File does not exists”
fi

Ví dụ 2: Chờ đến khi file được khởi tạo hoặc tồn tại thì thoát script.

#!/bin/bash
while [ ! -e myfile ]

; do
# Sleep until file does exists/is created
sleep 1
done

Vòng lặp FOR
Thể hiện danh sách các file trong folder định sẵn:

# !/bin/bash
# bash for loop
for f in $( ls /var/ ); do
echo $f
done

Hoặc bạn cũng có thể chạy dưới dạng command line:

# for f in $( ls /var/ ); do echo $f; done

Vòng lặp WHILE
Đoạn code mẫu ví dụ trong vòng lặp while:

#!/bin/bash
COUNT=6
# bash while loop
while [ $COUNT -gt 0 ]

; do
echo Value of count is: $COUNT
let COUNT=COUNT-1
done

Mã 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/bash
COUNT=0
# bash until loop
until [ $COUNT -gt 5 ]

; do
echo Value of count is: $COUNT
let COUNT=COUNT+1
done

Ngượ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/bash
# BASH FUNCTIONS CAN BE DECLARED IN ANY ORDER
function function_B {
echo Function B.
}
function function_A {
echo $1
}
function function_D {
echo Function D.
}
function function_C {
echo $1
}
# FUNCTION CALLS
# Pass parameter to function A
function_A “Function A.”
function_B
# Pass parameter to function C
function_C “Function C.”
function_D

Bash Select

#!/bin/bash
PS3=’Choose one word: ‘
# bash select
select word in “linux” “bash” “scripting” “tutorial”
do
echo “The word you have selected is: $word”
# Break, otherwise endless loop
break
done
exit 0

Bash 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 , sau đó tạo file backup-database với nội dung như sau:

#!/bin/bash
echo Starting Backup
mysqldump web_data > /backup/database/web_data_`date +%e-%m-%y`.sql
echo Backup Finished

Quá đơn giản phải không?

  • Trong đó lệnh echo để thể hiện Text, đây cũng có thể gọi là “hello world” vậy.
  • Dòng mysqldump là câu lệnh backup database web_data ghi ra file web_data_ngay_thang_nam.sql trong thư mục /backup/database.
  • Dòng thứ 3 báo hiệu đã backup xong.

Để chạy file backup ta có thể dùng sh,bash trong của sổ SSH.Ví dụ:

sh /scripts/backup-database

Nế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.

Tham gia thảo luận bài viết tại forum : http://forum.gocit.vn/threads/lap-trinh-bash-shell-script.225/

Print Friendly

Comments

comments

Bài viết liên quan