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.
- 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 => 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<$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 !