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.

Sau đâ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 !