vps gia re sale@vpsgiare.info
134/10 Đường Số 10, P16, Q GV
Hồ Chí Minh , 700000 Việt Nam
0937722220

This hCard created with the hCard creator.

vps gia re sale@vpsgiare.info
134/10 Đường Số 10, P16, Q GV
Hồ Chí Minh , 700000 Việt Nam
0937722220

This hCard created with the hCard creator.

Tìm Hiểu Lập Trình Bash Shell Script Linux

Đối với các bạn quản trị server hoặc vps chuyên nghiệp thì khái niệm bash shell không còn là gì quá xa lạ. Nó là một file chứa các câu lệnh để thực thi các mục đích cửa người dùng, nó được sử dụng rất rộng rãi, những file cài đặt cũng dùng cách này để thực hiện các câu lệnh.

hello_world_bash_shell_script2Sau đây mình sẽ giới thiệu các loại shell hiện nay:

  • BASH ( Bourne-Again SHell ) phát triển bởi Brian Fox và Chet Ramey. Đây là loại shell được sử dụng phổ biến 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). Cấu trúc lệnh giống như ngôn ngữ C nên rất thuận lợi cho các bạn phát triển C trên hệ thống 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, loại này thì ít được sử dụng.

Để biết được hệ thống của bạn đang hỗ trợ ngôn ngữ shell nào bạn dùng lệnh #cat /etc/shells. Mỗi loại shell sẽ có các câu lệnh khác nhau, chức năng khác nhau. Trong windown cũng có môi trường tương tự như linux đó là MS-DOS nhưng không mạnh mẽ bằng linux.

Để biết hệ thống bạn đang chạy shell gì bạn dùng câu lệnh sau: #echo $SHELL

Tạo File Shell Đầu Tiên "Hello Word"

chúng ta tạo một file tên là hello_word.sh, các bạn nhớ chmod với quyền là 755 nhé, để nó có quyền thực thi file, nội dung như sau:

#!/bin/bash
# dòng ở phí trên là nội dung bắt buộc khi làm bash shell
# khai báo biến STRING
STRING="Hello World"
# in nội dung của biến STRING ra màn hình
echo $STRING

để chạy file bạn dùng câu lệnh sau:

sh hello_world.sh
# sau khi chạy câu lệnh trên, trên màn hình sẽ có dòng chữ "hello word"

Các Script Nâng Cao

mình sẽ ví dụ cho các bạn các đoạn shell cơ bản để thực hiện các nhiệm vụ trong quá trình quản trị hệ thống

#!/bin/bash
# tạo ra một chuỗi có dạng www_năm_tháng_ngày.tar.gz
OF=www_$(date +%Y%m%d).tar.gz
# nén thư mục /home/www và đặt tên như biên OF đã khai báo ở trên
tar -czf $OF /home/www

sau đây là ví dụ về biến toàn cục, cục bộ

#!/bin/bash
# khai báo biến toàn cục
# đây là một loại biến có thể sử dụng ở bất cứ đâu trong file 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
# chú ý là biến toàn cục không thay đổi
# tiếp tục in ra biến toàn cục
echo $VAR

# kết quả trả về lần lượt là: "global variable", "local variable" và "global variable"

trong ví dụ trên biến trong hàm có tên "bash" chỉ có tác dụng khi xử lý hàm thôi, không làm ảnh hưởng và không lưu sau khi thực hiện xong hàm.

Đối số cho bash script

#!/bin/bash
# sử dụng các biến được xác định trước để truy cập đối số được truyền
# in ra các đối số
echo $1 $2 $3 ' -> echo $1 $2 $3'
# chúng ta còn có thể sử dụng các đối số được lưu trữ từ bash <a title=”See the tag: command (5 posts)” class=”autobesttag” rel=”nofollow” href=”http://abc.vn/command/”>command</a> dòng comment trong mảng
args=("$@")
# in ra đối số
echo ${args[0] } ${args[1] } ${args[2] } ' -> args=("$@"); echo ${args[0] } ${args[1] } ${args[2]}'
# sử dụng $@ để in ra tất cả các đối số trên 1 dòng
echo $@ ' -> echo $@'
# sử dụng $# đối số để in ra ngoài
# số của những đối số được truyền vào bash script
echo Number of arguments passed: $# ' -> echo Number of arguments passed: $#'


# kết quả trả về
#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 trong bash

#!/bin/bash
# sử dụng cặp dấu ` ` để thực thi lệnh
echo `uname -o`
# executing bash command without backticks
echo uname -o

# kết quả trả về
# GNU/Linux
# uname -o

Đọc dữ liệu đầu vào

#!/bin/bash
echo -e "hãy nhập vào một từ: \c "
# đọc dữ liệu người dùng nhập vào
read word
echo "Từ mà bạn nhập vào là: $word"
echo -e "Bạn có thể nhập vào 2 từ liên tiếp được không? "
# đọc 2 từ người dùng nhập vào, nhập xong nhấn enter
read word1 word2
echo "Đây là 2 từ bạn đã nhập: \"$word1\" \”$word2\""
# dấu \" dùng để sử dụng lại dấu đó khi nó được bao bởi cặp dấu ""
echo -e "Bạn cảm thấy thế nào về vi dụ này? "
# đọc đoạn command của người dùng, nếu không có biến thì mặc định sẽ lưu vào biến $REPLY
read
echo "bạn nói: $REPLY "
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: thực thi lệnh khi đầu vào là "ctrl + c"

#!/bin/bash
trap bashtrap INT
# lệnh xóa tất cả chữ trên màn hình
clear;
# hàm bash trap sẽ được thực thi khi nhấn CTRL-C:
# in ra thông điệp =&gt; thực thi chương trình con Bash Trap !
bashtrap()
{
    echo "CTRL+C !…đang thực thi bash trap !"
}
# vòng lặp chạy từ 1 đến 10
for a in `seq 1 10`; do
echo "$a/10 to Exit."
sleep 1;
done
echo "Thoát Bash Trap!!!"

Mảng ( array )

#!/bin/bash
# khai báo mảng gồm 4 phần tử
ARRAY=( 'Debian Linux' 'Redhat Linux' 'Ubuntu' 'Linux')
# lấy các phần tử trong mảng
ELEMENTS=${#ARRAY[@]}
# xuất ra các phần tử
for (( i=0;i&lt;$ELEMENTS;i++)); do
    echo ${ARRAY[${i}]}
done

#kết quả trả về: Debian Linux, Redhat Linux, Ubuntu, Linux

Câu điều kiện if else

#!/bin/bash
directory="./BashScripting"
# kiểm tra thư mục tồn tại hay không
if [ -d $directory ]; then
echo "Directory exists"
else
echo "Directory does not exists"
fi

# lưu ý có khoảng trắng giữa dấu [ và dấu ], kết thúc bằng fi

Câu điều kiện if else lồng vào nhau

#!/bin/bash
# khai báo các biến để lựa chọn cho người dùng nhập vào
choice=4
# in ra hướng dẫn cho người dùng
echo "1. Bash"
echo "2. Scripting"
echo "3. Tutorial"
echo -n "vui lòng lựa chọn 1 từ [1,2 hoặc 3] ? "
# vòng lặp được chọn khi biến bằng 4
# bash while loop
while [ $choice -eq 4 ]

; do
# đọc dữ liệu người dùng nhập vào
read choice
# nếu người dùng nhập vào là 1
if [ $choice -eq 1 ]

; then
    echo "bạn đã chọn từ: Bash"
else
    if [ $choice -eq 2 ]
    
    ; then
        echo "bạn đã chọn từ: Scripting"
    else
        if [ $choice -eq 3 ]
        
        ; then
            echo "bạn đã chọn từ: Tutorial"
        else
            echo "vui lòng chọn từ 1 đến 3 !"
            echo "1. Bash"
            echo "2. Scripting"
            echo "3. Tutorial"
            choice=4
        fi
    fi
fi
done

Các Phép So Sánh Toán Tử Trong shell

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

#!/bin/bash
# khai báo 2 số
NUM1=2
NUM2=2
if [ $NUM1 -eq $NUM2 ]
; then
    echo "2 số bằng nhau"
else
    echo "2 số không bằng nhau"
fi

So Sánh Chuỗi Trong Shell

=     equal
!=     not equal
<     less then
>     greater then
-n s1     s1 không rỗng
-z s1     s1 rỗng

#!/bin/bash
# khai báo chuỗi s1
S1="Bash"
# khai báo chuỗi s2
S2="Scripting"
if [ $S1 = $S2 ]

; then
echo "2 chuỗi giống nhau"
else
echo "2 chuỗi không giống nhau"
fi

Kiểm Tra File Trong Bash Shell

-b filename     khóa file đặc biệt
-c filename     từ đặc biệt
-d directoryname     kiểm tra đường dẫn thư mục
-e filename     kiểm tra đường dẫn file
-f filename     kiểm tra một tập tin không phải là một thư mục
-G filename     kiểm tra nếu file tồn tại và owner là ID group thuộc user hiện hành.
-g filename     true nếu file tồn tại và set-group-id.
-k filename     Sticky bit
-L filename     biểu tượng liên kết
-O filename     True nếu file tồn tại được tạo bới user hiện hành.
-r filename     kiểm tra nếu file có khả năng đọc
-S filename     kiểm tra nếu file socket
-s filename     kiểm tra nếu file không rỗng
-u filename     kiểm tra nếu file được tạo bởi người dùng hiện hành
-w filename     kiểm tra nếu file có khả năng ghi
-x filename     kiểm tra nếu file có khả năng thực thi

====== ví dụ 1: kiểm tra file 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

# !/bin/bash
for f in $( ls /var/ ); do
echo $f
done
# liệt kê tất cả các file trong thư mục

Vòng Lặp while

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

; do
echo "giá trị là: $COUNT"
let COUNT=COUNT-1
done
# cho ra giá trị giảm dần cho tới khi bằng 0

vòng lặp until

#!/bin/bash
COUNT=0
until [ $COUNT -gt 5 ]
; do
echo "giá trị đếm được là: $COUNT"
let COUNT=COUNT+1
done
# cho ra giá trị tăng dần từ 1 tới 5

Viết Hàm Trong Shell

!/bin/bash
function function_B {
    echo "Function B."
}
function function_A {
    echo $1
}
function function_D {
    echo "Function D."
}
function function_C {
    echo $1
}
# gọi hàm
# gán tham số cho function A
function_A "Function A."
function_B
# gán tham số cho function C
function_C "Function C."
function_D

Lựa chọn trong bash

#!/bin/bash
PS3='Chọn một chữ: '
# lựa chọn trong bash
select word in "linux" "bash" "scripting" "tutorial"
do
echo "The word you have selected is: $word"
break
done
exit 0

Trên là những gì cơ bản mà mình biết về bash shell, từ những kiến thức này bạn có thể kết với với các câu lệnh trên hệ thống linux bạn sẽ làm được rất nhiều việc như: tự động xóa cache, giải phóng ram theo định kỳ, kiểm tra và gửi email khi hệ thống quả tải hoặc bị xâm nhập... Mình ví dụ cho các bạn một file mà mình đang sử dụng đó là backup mysql định kỳ theo tuần, cái này bạn cần kết hợp với cron trong linux nhé.

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

chúc các bạn thành công !

 

Tags: