Information Technology | Softwares - Graphics - Programming - Hacking - Security

May 28, 2018

Shell Script basic tutorial - Lập trình Bash Shell Script cơ bản

Bash được viết tắt của Bourne-again shell là một ngôn ngữ lập trình thông dụng nhất trên linux và được viết bởi Chet Ramey và Brian Fox. Bash shell script dùng hạt nhân để thực thi các chương trình và tạo ra các tập tin. Thuận tiện hơn là nó dùng các câu lệnh tiếng anh theo cú pháp cho trước và chuyển nó đến kernel để xử lý tiếp rồi trả về kết quả cho người dùng. Một số shell khác như Korn Shell bởi David Korn, C Shell được phát triển bởi Bill Joy tại trường đại học của California với cấu trúc lập trình giống C trên Linux.
Mỗi loại Shell có cú pháp cũng như cách dùng khác nhau và chức năng khác nhau. Nhập Cat /etc/shells để biết hệ thống của bạn hỗ trợ những shell nào. echo $SHELL để biết hệ thống đã chạy shell nào.

Chạy chương trình:
Một file được viết bởi Bash sẽ có đuôi .sh. Tạo một file.sh và viết code, ta có thể viết trên Leafpad, Vim hoặc Nano.
Và để chạy file này ta mở terminal và nhập bash file.sh hoặc chmod +x file.sh sau đó ./file.sh hoặc sh file.sh

Một số bài ví dụ Bash Shell Script:
Dòng đầu tiên luôn là cú pháp #!/bin/bash còn những dòng dưới sau kí tự # được hiểu là comment.

In ra màn hình một đoạn text
#!/bin/bash String="Hello world" echo $String

String="hello world" khai báo biến string với nội dung là một chuỗi
echo $String hiển thị biến String ra màn hình. Hoặc ta chỉ cần viết echo Hello world

Đọc dữ liệu đầu vào
#!/bin/bash echo -n "welcome to it-vn. What your name: " read name echo "hi $name :D" echo -n "topic do you like from us: " read topic echo "thanks you!. we will update more post about \"$topic\"" echo "what do you feel about us:" read FBACK echo "you said \"$FBACK\""
Với cú pháp echo để in ra màn hình, nếu không có -e thì một dòng mới sẽ được tạo sau cú pháp echo và -n là giữ nguyên cho người dùng nhập trên cùng một dòng. Chuỗi kí tự được đặt trong dấu "", không bắt buộc vì câu lệnh echo sẽ kết thúc khi xuống dòng.
Nếu ta muốn in kí tự " hoặc ' ra màn hình, ta sẽ dùng \" như trên.
read dùng để nhập dữ liệu có định dạng từ cửa sổ dòng lệnh vào các biến.

Biến toàn cục và biết cục bộ
#!/bin/bash var="pentest" function mm { local var = "linux" echo $var } echo $var mm echo $var
Ta có thể thấy như trong hình local var="linux" nó sẽ chỉ gán biến var = "linux" trong hàm mm, đó là biến cục bộ. Còn nếu muốn gán var bằng một giá trị khác trong toàn bộ script ta chỉ cần bỏ chữ local trước đó đi là được, khi đó var là biến toàn cục.

Vòng lặp for
#!/bin/bash for i in {30..37} do echo -e "\e[${i}mLaladee\e[0m" done

Mỗi lần lặp i sẽ được gán với giá trị lần lượt từ giá trị này tới giá trị kia và sau do là câu lệnh sẽ được thực hiện trong vòng lặp đó. Ở ví dụ này i được gán từ 30 tới 37 và mỗi lần lặp sẽ in ra đoạn text có màu là giá trị i, những mã màu từ 30 đến 37.




Vòng lặp while
#!/bin/bash count=0 while [ $count -lt 10 ] do echo value of count is: $count let count=count+1 done

Câu lệnh while sẽ lặp đi lặp lại khi điều kiện vẫn thỏa mãn. nếu điều kiện thỏa mãn câu lệnh sau do sẽ được thực thi.
Câu lệnh let để gán biến đã có bằng một giá trị khác. 
Kí tự -lt là phép <





Vòng lặp until 
#!/bin/bash count=0 until [ $count -gt 10 ] do echo value of count is: $count let count=count+1 done

Câu lệnh until sẽ lặp đi lặp lại cho đến khi điều kiện thỏa mãn. Nếu điều kiện thỏa mãn câu lệnh sau do sẽ không được thực thi.
Kí tự -gt là phép >








so sánh toán tử
-lt
-gt
-le
<=
-ge
>=
-eq
=
-ne
!=

Chương trình cộng 2 số:
if [ $# -ne 2 ] then echo "Wrong Input" echo "Bash q1.sh <number1> <number2>" exit 1 fi echo "Sum of $1 and $2 is `expr $1 + $2`"

output:








Chương trình tìm max của 3 số:
if [ $# -ne 3 ] then echo Wrong Input echo "Bash q2.sh <number1> <number2> <number3>" >&2 exit 1 fi n1=$1 n2=$2 n3=$3 if [ $n1 -gt $n2 ] && [ $n1 -gt $n3 ] then echo "$n1 is Bigest number" elif [ $n2 -gt $n1 ] && [ $n2 -gt $n3 ] then echo "$n2 is Bigest number" elif [ $n3 -gt $n1 ] && [ $n3 -gt $n2 ] then echo "$n3 is Bigest number" elif [ $1 -eq $2 ] && [ $1 -eq $3 ] && [ $2 -eq $3 ] then echo "All the three numbers are equal" else echo "I can not figure out which number is biger" fi

output:






Chương trình sử dụng Case - Tạo máy tính cơ bản
if test $# = 3 then case $2 in +) let z=$1+$3;; -) let z=$1-$3;; /) let z=$1/$3;; x|X) let z=$1*$3;; *) echo Warning - $2 invalied operator, only +,-,x,/ operator allowed exit;; esac echo Answer is $z else echo "Wrong Input!!!" echo "Bash q4.sh <number1> [optiong] <number2>" echo "Options: + - x /" fi
output:
















Một số kí tự đặc biết cho hàm in Echo
\b
Blankspace
\c
Print line without moving cursor to next line
\f
Form feed
\n
Newline
\r
Carrage return
\t
Horizontal tab
\v
Vertical tab
Backslash
\ON
Character whose ASCII number is octal N

Backup một thư mục:
tar -czf data.tar.gz Downloads/data
hoặc
zip -r data.zip Downloads/data
hoặc
tar -jcf data.tar.bz2 Downloads/data
Như vậy là ta đã nén thư mục data trong Downloads với tên là data.tar.gz hoặc data.zip hay data.tar.bz2.
để giải nén:
với file nén .tar.gz thì ta dùng lệnh tar -zxvf data.tar.gz
với file nén .zip unzip file.zip
với file nén .tar.bz2 tar -jxvf file.tar.bz2
với file nén .gz gunzip
Gom một tập tin hoặc thư mục tar -cvf [tênfile.tar] [file1] [file2] ...
Bung tar -xvf [file.tar]



Kiểm tra ping của một list tên miền
#!/bin/bash if [ $# -eq 0 ]; then echo "domain list name not found. Try again!" exit 0 else if [ ! -f $1 ]; then echo "File not found!" exit 0 fi fi
_FILENAME=${1} cat ${_FILENAME} | while read _domaindo result="`ping ${_domain} -c 1 2> /dev/null | head -n 1 | awk '{print $2, $3}' | sed 's/(//; s/)//'`" ip_address="`echo ${result} | awk '{print $2}'`" echo ${result} done

Run:




Chương trình trên đã check được ping của các tên miền bên trong một file text.


Extract zip file many times | password from the name of the zip file (base64 encoded):
#!/bin/bash while : do name=$(ls *.zip | sed -e 's/\.zip//') pass=$(echo $name | base64 --decode) echo -n Hi Laladee. Password is $pass 7z e -p$(echo $pass) *.zip echo Unzip completed ^^ rm $(echo $name).zip echo "Removed old file" done

Bài viết này mình mới chỉ hướng dẫn cơ bản, còn thiếu rất nhiều và có thể sẽ còn update thêm các lệnh, các hàm hay một số ứng dụng nhỏ được sử dụng bash để viết, các bạn có thể tham khảo các tài liệu để học shell script.
Một số tài liệu hay và quý hướng dẫn bash shell script chi tiết:
Penetration Testingwith the Bash shell bởi Keith Makan
Linux Shell Scripting CookBook bởi Shantanu Tushar và Sarath Lakshman
Mastering Linux Shell Scripting bởi Andrew Mallett

Share:

About Us