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
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ộ
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`"
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
_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