Lập trình Bash Shell Script

Thảo luận trong 'Góc Lập Trình - Database' bắt đầu bởi hautp, Thg 11 9, 2012.

  1. hautp

    hautp Well-Known Member

    GIT – Góc IT gởi đến các bạn loạt bài viết tổng hợp Bash Shell 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 Linux:
    • 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à 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
    # 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=(“[email protected]”)
    #echo arguments to the shell
    echo ${args[0] } ${args[1] } ${args[2] } ‘ -> args=(“[email protected]”); echo ${args[0] } ${args[1] } ${args[2]
    }’
    #use [email protected] to print out all arguments at once
    echo [email protected] ‘ -> echo [email protected]
    # 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=(“[email protected]”); echo ${args[0] } ${args[1] } ${args[2]
    }
    Bash Shell Script -> echo [email protected]
    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 scripts, 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.
     

Chia sẻ trang này