Trong Linux, tự động hóa quy trình phụ thuộc rất nhiều vào kịch bản shell. Điều này bao gồm việc tạo ra một tệp chứa một loạt các lệnh có thể được thực thi cùng nhau.
Trong bài viết này, chúng ta sẽ bắt đầu với những kiến thức cơ bản về kịch bản bash, bao gồm biến, lệnh, đầu vào/đầu ra và gỡ lỗi. KDATA cũng sẽ chỉ ra các ví dụ về từng phần trên suốt hành trình.
Hãy bắt đầu nào. 🚀
Để theo dõi bài hướng dẫn này, bạn cần có:
Một kịch bản bash là một tệp chứa một chuỗi các lệnh được thực thi bởi chương trình bash theo từng dòng. Nó cho phép bạn thực hiện một loạt các hành động, như điều hướng đến một thư mục cụ thể, tạo một thư mục và khởi động một quy trình sử dụng dòng lệnh.
Bằng cách lưu các lệnh này trong một kịch bản, bạn có thể lặp lại cùng một chuỗi bước nhiều lần và thực thi chúng bằng cách chạy kịch bản đó.
Kịch bản bash là một công cụ mạnh mẽ và linh hoạt để tự động hóa các nhiệm vụ quản trị hệ thống, quản lý tài nguyên hệ thống và thực hiện các nhiệm vụ thường xuyên khác trong hệ thống Unix/Linux. Một số ưu điểm của kịch bản shell bao gồm:
Các thuật ngữ "shell" và "bash" thường được sử dụng thay thế cho nhau. Tuy nhiên, có một sự khác biệt nhỏ giữa hai thuật ngữ này.
Thuật ngữ "shell" đề cập đến một chương trình cung cấp giao diện dòng lệnh để tương tác với hệ điều hành. Bash (Bourne-Again SHell) là một trong những shell Unix/Linux được sử dụng phổ biến nhất và là shell mặc định trong nhiều bản phân phối Linux.
Một shell hoặc giao diện dòng lệnh trông như thế này:
Trong đầu ra trên, zaira@Zaira
là dấu nhắc shell. Khi shell được sử dụng tương tác, nó hiển thị $
khi đang chờ lệnh từ người dùng.
Nếu shell đang chạy với quyền root (một người dùng có quyền quản trị), dấu nhắc sẽ được thay đổi thành #
. Dấu nhắc shell của superuser trông như thế này:
[root@host ~]#
Mặc dù Bash là một loại shell, còn có các shell khác như Korn shell (ksh), C shell (csh) và Z shell (zsh). Mỗi shell có cú pháp và tập hợp tính năng riêng, nhưng chúng đều có mục đích chung là cung cấp giao diện dòng lệnh để tương tác với hệ điều hành.
Bạn có thể xác định loại shell của mình bằng cách sử dụng lệnh ps
:
ps
Đây là đầu ra của tôi:
Tóm lại, trong khi "shell" là một thuật ngữ rộng đề cập đến bất kỳ chương trình nào cung cấp giao diện dòng lệnh, "Bash" là một loại shell cụ thể được sử dụng rộng rãi trong các hệ thống Unix/Linux.
Lưu ý: Trong hướng dẫn này, chúng ta sẽ sử dụng shell "bash".
Như đã đề cập trước đó, dấu nhắc shell có dạng như sau:
[username@host ~]$
Bạn có thể nhập bất kỳ lệnh nào sau dấu $ và xem kết quả trên terminal.
Thông thường, các lệnh tuân theo cú pháp sau:
command [OPTIONS] arguments
Hãy cùng thảo luận một vài lệnh bash cơ bản và xem đầu ra của chúng. Hãy làm theo nhé :)
zaira@Zaira:~/shell-tutorial$ date
Tue Mar 14 13:08:57 PKT 2023
zaira@Zaira:~/shell-tutorial$ pwd
/home/zaira/shell-tutorial
zaira@Zaira:~/shell-tutorial$ ls
check_palindrome.sh count_odd.sh env log temp
zaira@Zaira:~/shell-tutorial$ echo "Hello bash"
Hello bash
Bạn luôn có thể tham khảo hướng dẫn của lệnh với lệnh man
.
Ví dụ, hướng dẫn của lệnh ls
trông như thế này:
Theo quy ước, kịch bản bash kết thúc bằng .sh. Tuy nhiên, kịch bản bash có thể chạy hoàn toàn bình thường mà không cần phần mở rộng .sh.
Kịch bản bash bắt đầu bằng shebang. Shebang là sự kết hợp của ký tự # và ký tự ! theo sau là đường dẫn tới bash shell. Đây là dòng đầu tiên của kịch bản. Shebang cho shell biết phải thực thi kịch bản này qua bash shell. Shebang chỉ đơn giản là một đường dẫn tuyệt đối tới trình thông dịch bash.
Dưới đây là ví dụ về dòng shebang.
#!/bin/bash
Bạn có thể tìm đường dẫn tới bash shell của mình (có thể khác so với trên) bằng cách sử dụng lệnh:
which bash
Kịch bản đầu tiên sẽ yêu cầu người dùng nhập một đường dẫn. Đổi lại, nội dung của đường dẫn đó sẽ được liệt kê.
Tạo một tệp có tên là run_all.sh bằng lệnh vi. Bạn có thể sử dụng bất kỳ trình soạn thảo nào mà bạn thích.
vi run_all.sh
Thêm các lệnh sau vào tệp của bạn và lưu lại:
#!/bin/bash
echo "Today is " `date`
echo -e "\nenter the path to directory"
read the_path
echo -e "\nYour path has the following files and folders: "
ls $the_path
Kịch bản để in nội dung của thư mục do người dùng cung cấp
Hãy xem xét kỹ hơn kịch bản từng dòng một. Tôi sẽ hiển thị lại kịch bản này, nhưng lần này có thêm số dòng.
1 #!/bin/bash
2 echo "Today is " `date`
3
4 echo -e "\nenter the path to directory"
5 read the_path
6
7 echo -e "\nYour path has the following files and folders: "
8 ls $the_path
Để làm cho kịch bản có thể thực thi, cấp quyền thực thi cho người dùng của bạn bằng lệnh này:
chmod u+x run_all.sh
Ở đây:
Bạn có thể chạy kịch bản bằng bất kỳ phương pháp nào sau đây:
sh run_all.sh
bash run_all.sh
./run_all.sh
Hãy xem nó hoạt động như thế nào 🚀
Bình luận bắt đầu bằng ký tự # trong kịch bản bash. Điều này có nghĩa là bất kỳ dòng nào bắt đầu bằng # sẽ là bình luận và sẽ bị trình thông dịch bỏ qua.
Bình luận rất hữu ích trong việc ghi chú mã, và đó là một thực hành tốt để thêm chúng giúp người khác hiểu mã.
Ví dụ về bình luận:
# Đây là một ví dụ về bình luận
# Cả hai dòng này sẽ bị trình thông dịch bỏ qua
Biến cho phép bạn lưu trữ dữ liệu. Bạn có thể sử dụng biến để đọc, truy cập và thao tác dữ liệu trong suốt kịch bản của mình.
Không có kiểu dữ liệu trong Bash. Trong Bash, một biến có thể lưu trữ giá trị số, ký tự đơn lẻ hoặc chuỗi ký tự.
Trong Bash, bạn có thể sử dụng và thiết lập giá trị biến theo các cách sau:
1. Gán giá trị trực tiếp:
country=Pakistan
2. Gán giá trị dựa trên đầu ra nhận được từ một chương trình hoặc lệnh, sử dụng thay thế lệnh. Lưu ý rằng $ được yêu cầu để truy cập giá trị của biến hiện có.
same_country=$country
Điều này gán giá trị của country cho biến mới same_country. Để truy cập giá trị biến, thêm $ vào tên biến.
zaira@Zaira:~$ country=Pakistan
zaira@Zaira:~$ echo $country
Pakistan
zaira@Zaira:~$ new_country=$country
zaira@Zaira:~$ echo $new_country
Pakistan
Trong kịch bản Bash, các quy ước đặt tên biến như sau:
Ví dụ về các tên biến hợp lệ trong Bash:
name
count
_var
myVar
MY_VAR
Ví dụ về các tên biến không hợp lệ:
Theo các quy ước đặt tên này giúp kịch bản Bash dễ đọc và dễ bảo trì hơn.
1. Đọc đầu vào từ người dùng và lưu nó vào một biến:
#!/bin/bash
echo "Today is " `date`
echo -e "\nenter the path to directory"
read the_path
echo -e "\nyour path has the following files and folders: "
ls $the_path
2. Đọc từ tệp
Mã này đọc từng dòng từ tệp input.txt và in nó ra terminal. Chúng ta sẽ tìm hiểu về vòng lặp while sau trong bài viết này.
while read line
do
echo $line
done < input.txt
3. Tham số dòng lệnh
Trong một kịch bản hoặc hàm bash, $1 biểu thị đối số ban đầu được truyền, $2 biểu thị đối số thứ hai được truyền, và cứ thế.
Kịch bản này nhận một tên làm tham số dòng lệnh và in một lời chào cá nhân hóa.
echo "Hello, $1!"
Chúng ta đã cung cấp Zaira làm đối số cho kịch bản:
#!/bin/bash
echo "Hello, $1!"
Mã cho kịch bản: greeting.sh
Ở đây chúng ta sẽ thảo luận một số phương pháp nhận đầu ra từ các kịch bản.
1. In ra terminal:
echo "Hello, World!"
Điều này in văn bản "Hello, World!" ra terminal.
2. Ghi vào tệp:
echo "This is some text." > output.txt
Điều này ghi văn bản "This is some text." vào tệp output.txt. Lưu ý rằng toán tử > ghi đè một tệp nếu nó đã có nội dung.
3. Thêm vào tệp:
echo "More text." >> output.txt
Điều này thêm văn bản "More text." vào cuối tệp output.txt.
4. Chuyển hướng đầu ra:
ls > files.txt
Điều này liệt kê các tệp trong thư mục hiện tại và ghi đầu ra vào tệp files.txt. Bạn có thể chuyển hướng đầu ra của bất kỳ lệnh nào vào tệp theo cách này.
Xem thêm: Lệnh lsblk là gì? Sử dụng lsblk trên Linux để liệt kê tên thiết bị, phân vùng
Dưới đây là danh sách một số lệnh bash được sử dụng phổ biến nhất:
Biểu thức sản sinh ra kết quả boolean, hoặc đúng hoặc sai, được gọi là điều kiện. Có nhiều cách để đánh giá điều kiện, bao gồm if, if-else, if-elif-else, và điều kiện lồng nhau.
Cú pháp:
if [[ condition ]];
then
statement
elif [[ condition ]]; then
statement
else
do this by default
fi
Chúng ta có thể sử dụng các toán tử logic như AND -a và OR -o để so sánh có ý nghĩa hơn.
if [ $a -gt 60 -a $b -lt 100 ]
Câu lệnh này kiểm tra nếu cả hai điều kiện đúng: a lớn hơn 60 VÀ b nhỏ hơn 100.
Hãy xem ví dụ về một kịch bản Bash sử dụng if, if-else, và if-elif-else để xác định nếu một số do người dùng nhập vào là dương, âm, hoặc bằng không:
#!/bin/bash
echo "Please enter a number: "
read num
if [ $num -gt 0 ]; then
echo "$num is positive"
elif [ $num -lt 0 ]; then
echo "$num is negative"
else
echo "$num is zero"
fi
Kịch bản để xác định nếu một số là dương, âm, hoặc bằng không.
Kịch bản đầu tiên yêu cầu người dùng nhập vào một số. Sau đó, nó sử dụng câu lệnh if để kiểm tra nếu số lớn hơn 0. Nếu đúng, kịch bản sẽ thông báo rằng số là dương. Nếu số không lớn hơn 0, kịch bản sẽ chuyển đến câu lệnh if-elif tiếp theo. Tại đây, kịch bản kiểm tra nếu số nhỏ hơn 0. Nếu đúng, kịch bản sẽ thông báo rằng số là âm. Cuối cùng, nếu số không lớn hơn 0 cũng không nhỏ hơn 0, kịch bản sử dụng câu lệnh else để thông báo rằng số là bằng không.
Hãy xem nó hoạt động như thế nào 🚀
Vòng lặp while kiểm tra điều kiện và lặp lại cho đến khi điều kiện đó còn đúng. Chúng ta cần cung cấp một câu lệnh bộ đếm để tăng giá trị bộ đếm nhằm kiểm soát việc thực thi vòng lặp.
Trong ví dụ dưới đây, (( i += 1 )) là câu lệnh bộ đếm tăng giá trị của i. Vòng lặp sẽ chạy chính xác 10 lần.
#!/bin/bash
i=1
while [[ $i -le 10 ]] ; do
echo "$i"
(( i += 1 ))
done
Vòng lặp while chạy 10 lần.
Vòng lặp for, cũng giống như vòng lặp while, cho phép bạn thực thi các câu lệnh một số lần nhất định. Mỗi vòng lặp khác nhau về cú pháp và cách sử dụng.
Trong ví dụ dưới đây, vòng lặp sẽ lặp lại 5 lần.
#!/bin/bash
for i in {1..5}
do
echo $i
done
Vòng lặp for chạy 5 lần.
Trong Bash, câu lệnh case được sử dụng để so sánh một giá trị với một danh sách các mẫu và thực thi một khối mã dựa trên mẫu đầu tiên khớp. Cú pháp cho một câu lệnh case trong Bash như sau:
case expression in
pattern1)
# mã thực thi nếu biểu thức khớp với pattern1
;;
pattern2)
# mã thực thi nếu biểu thức khớp với pattern2
;;
pattern3)
# mã thực thi nếu biểu thức khớp với pattern3
;;
*)
# mã thực thi nếu không có mẫu nào khớp với biểu thức
;;
esac
Ở đây, "expression" là giá trị mà chúng ta muốn so sánh, và "pattern1", "pattern2", "pattern3", v.v. là các mẫu mà chúng ta muốn so sánh.
Dấu chấm phẩy đôi ";;" tách mỗi khối mã thực thi cho mỗi mẫu. Dấu hoa thị "*" đại diện cho trường hợp mặc định, sẽ thực thi nếu không có mẫu nào khớp với biểu thức.
Ví dụ:
fruit="apple"
case $fruit in
"apple")
echo "This is a red fruit."
;;
"banana")
echo "This is a yellow fruit."
;;
"orange")
echo "This is an orange fruit."
;;
*)
echo "Unknown fruit."
;;
esac
Trong ví dụ này, vì giá trị của "fruit" là "apple", mẫu đầu tiên khớp và khối mã echo "This is a red fruit." được thực thi. Nếu giá trị của "fruit" là "banana", mẫu thứ hai sẽ khớp và khối mã echo "This is a yellow fruit." sẽ được thực thi, và cứ thế. Nếu giá trị của "fruit" không khớp với bất kỳ mẫu nào, trường hợp mặc định sẽ được thực thi, echo "Unknown fruit."
Cron là một công cụ mạnh mẽ để lên lịch công việc có sẵn trong các hệ điều hành giống Unix. Bằng cách cấu hình cron, bạn có thể thiết lập các công việc tự động chạy hàng ngày, hàng tuần, hàng tháng, hoặc theo thời gian cụ thể. Khả năng tự động hóa mà cron cung cấp đóng vai trò quan trọng trong quản trị hệ thống Linux.
Dưới đây là cú pháp để lên lịch cron:
# Cron job example
* * * * * sh /path/to/script.sh
Ở đây, các * đại diện cho phút, giờ, ngày, tháng và ngày trong tuần tương ứng.
Dưới đây là một số ví dụ về việc lên lịch các công việc cron:
0 0 * * *
Chạy một kịch bản vào lúc nửa đêm mỗi ngày : 0 0 * * * /path/to/script.sh*/5 * * * *
Chạy một kịch bản mỗi 5 phút : */5 * * * * /path/to/script.sh0 6 * * 1-5
Chạy một kịch bản vào lúc 6 giờ sáng từ thứ Hai đến thứ Sáu: 0 6 * * 1-5 /path/to/script.sh0 0 1-7 * *
Chạy một kịch bản vào 7 ngày đầu tiên của mỗi tháng: 0 0 1-7 * * /path/to/script.sh0 12 1 * *
Chạy một kịch bản vào ngày đầu tiên của mỗi tháng vào lúc trưa: 0 12 1 * * /path/to/script.shTiện ích crontab được sử dụng để thêm và chỉnh sửa các công việc cron.
crontab -l liệt kê các kịch bản đã được lên lịch cho một người dùng cụ thể.
Bạn có thể thêm và chỉnh sửa cron thông qua crontab -e.
Gỡ lỗi và khắc phục sự cố là những kỹ năng quan trọng đối với bất kỳ ai viết kịch bản Bash. Mặc dù các kịch bản Bash có thể cực kỳ mạnh mẽ, chúng cũng có thể dễ gặp lỗi và hành vi không mong muốn. Trong phần này, chúng ta sẽ thảo luận một số mẹo và kỹ thuật để gỡ lỗi và khắc phục sự cố kịch bản Bash.
Một trong những kỹ thuật hữu ích nhất để gỡ lỗi kịch bản Bash là đặt tùy chọn set -x ở đầu kịch bản. Tùy chọn này kích hoạt chế độ gỡ lỗi, khiến Bash in mỗi lệnh mà nó thực thi ra terminal, kèm theo dấu +. Điều này có thể cực kỳ hữu ích trong việc xác định nơi mà lỗi xảy ra trong kịch bản của bạn.
#!/bin/bash
set -x
# Your script goes here
Khi Bash gặp lỗi, nó sẽ đặt một mã thoát chỉ ra bản chất của lỗi. Bạn có thể kiểm tra mã thoát của lệnh gần nhất bằng cách sử dụng biến $?. Giá trị 0 chỉ ra thành công, trong khi bất kỳ giá trị nào khác chỉ ra lỗi.
#!/bin/bash
# Your script goes here
if [ $? -ne 0 ]; then
echo "Error occurred."
fi
Một kỹ thuật hữu ích khác để gỡ lỗi kịch bản Bash là chèn các câu lệnh echo vào trong mã của bạn. Điều này có thể giúp bạn xác định nơi mà lỗi xảy ra và giá trị nào đang được gán cho các biến.
#!/bin/bash
# Your script goes here
echo "Value of variable x is: $x"
# More code goes here
Nếu bạn muốn kịch bản của mình thoát ngay lập tức khi bất kỳ lệnh nào trong kịch bản thất bại, bạn có thể sử dụng tùy chọn set -e. Tùy chọn này sẽ khiến Bash thoát với lỗi nếu bất kỳ lệnh nào trong kịch bản thất bại, giúp dễ dàng xác định và sửa lỗi trong kịch bản của bạn.
#!/bin/bash
set -e
# Your script goes here
Chúng ta có thể khắc phục sự cố cron bằng cách kiểm tra các tệp nhật ký. Nhật ký được duy trì cho tất cả các công việc đã lên lịch. Bạn có thể kiểm tra và xác minh trong nhật ký nếu một công việc cụ thể đã chạy như dự định hay không.
Đối với Ubuntu/Debian, bạn có thể tìm thấy nhật ký cron tại:
/var/log/syslog
Vị trí này khác nhau đối với các bản phân phối khác.
Một tệp nhật ký công việc cron có thể trông như thế này:
2022-03-11 00:00:01 Task started
2022-03-11 00:00:02 Running script /path/to/script.sh
2022-03-11 00:00:03 Script completed successfully
2022-03-11 00:05:01 Task started
2022-03-11 00:05:02 Running script /path/to/script.sh
2022-03-11 00:05:03 Error: unable to connect to database
2022-03-11 00:05:03 Script exited with error code 1
2022-03-11 00:10:01 Task started
2022-03-11 00:10:02 Running script /path/to/script.sh
2022-03-11 00:10:03 Script completed successfully
Trong bài viết này, chúng ta đã bắt đầu với cách truy cập terminal và sau đó chạy một số lệnh bash cơ bản. Chúng ta cũng đã nghiên cứu về bash shell. Chúng ta đã xem qua cách phân nhánh mã sử dụng các vòng lặp và điều kiện. Cuối cùng, chúng ta đã thảo luận về việc tự động hóa các kịch bản sử dụng cron cùng với một số kỹ thuật khắc phục sự cố.
Ctrl + Alt + T
. Khi Terminal mở ra, bạn nhập và thực thi các lệnh.ls
: Liệt kê các tệp và thư mục trong thư mục hiện tại.cd
: Thay đổi thư mục hiện tại.cp
: Sao chép tệp hoặc thư mục.mv
: Di chuyển hoặc đổi tên tệp hoặc thư mục.rm
: Xóa tệp hoặc thư mục.echo
: Hiển thị một chuỗi văn bản hoặc biến.Để tìm hiểu thêm về cách sử dụng các lệnh này, bạn có thể tham khảo tài liệu hướng dẫn hoặc sử dụng lệnh man
để xem hướng dẫn chi tiết, ví dụ: man ls
để xem hướng dẫn sử dụng lệnh ls
.
Mọi người cùng tìm kiếm: bash, bash là gì, bash la gi, bash shell là gì, bash script là gì, bash -i
Tips: Tham gia Channel Telegram KDATA để không bỏ sót khuyến mãi hot nào