Bash shell là một trong những thành phần mạnh mẽ nhất của hệ điều hành Linux, đồng thời cũng là một trong những lý do hấp dẫn nhất để sử dụng Linux. Người dùng có thể tương tác với Bash thông qua dòng lệnh và viết các script để tự động hóa các tác vụ. Mặc dù điều này nghe có vẻ đáng sợ với người mới bắt đầu, nhưng thật ra bắt đầu với Bash scripting không quá khó các bạn nhé.
Contents
- 1 Bash Script là gì?
- 2 Những gì bạn sẽ học trong hướng dẫn này:
- 3 Yêu cầu phần mềm và quy ước dòng lệnh Linux
- 4 Hello World Bash Script – Hướng dẫn Bash Scripting
- 5 Script sao lưu đơn giản trong Bash
- 6 Biến trong Bash scripts
- 7 Nâng cấp với ví dụ backup dữ liệu với biến và dấu thời gian
- 8 Biến toàn cục và biến cục bộ trong Bash
- 9 Truyền đối số vào Bash Script
- 10 Thực thi lệnh Shell trong Bash
- 11 Đọc dữ liệu người dùng
- 12 Lệnh trap trong Bash
- 13 Mảng trong Bash Script
- 14 Câu lệnh điều kiện if/else/fi trong Bash
- 15 Câu lệnh if/else lồng nhau (nested if/else)
- 16 So sánh trong Bash
- 17 Kiểm tra file và thư mục trong Bash
- 18 Vòng lặp trong Bash
- 19 Hàm trong Bash
- 20 Lệnh select trong Bash
- 21 Câu lệnh case trong Bash
- 22 Dấu ngoặc và ký tự đặc biệt trong Bash
- 23 Phép toán số học trong Bash
- 24 Phép toán cơ bản với let
- 25 Mở rộng số học Bash: $(( )) và $[ ]
- 26 Làm tròn số thực trong Bash
- 27 Tính toán số thực với bc
- 28 Chuyển hướng đầu ra trong Bash
- 29 Kết luận
Bash Script là gì?
Bash script là một file văn bản chứa một chuỗi các lệnh được viết cho Bash shell, dùng để tự động hóa các tác vụ, thực thi nhiều lệnh, hoặc tạo ra các chương trình đơn giản trên các hệ thống dựa trên Unix như Linux và macOS. Điều đó có nghĩa là nếu bạn thường xuyên sử dụng dòng lệnh Linux, thì Bash script sẽ khá đơn giản với bạn. Mọi thứ trong một Bash script đều có thể thực thi trực tiếp từ dòng lệnh.
Trong hướng dẫn này, tôi sẽ hướng dẫn bạn qua nhiều ví dụ về Bash script để bạn thấy được sức mạnh và cách khai thác các khía cạnh khác nhau của Bash.
Những gì bạn sẽ học trong hướng dẫn này:
-
Cách viết script “Hello World” đầu tiên bằng Bash
-
Cách truyền tham số vào Bash script
-
Cách sử dụng biến toàn cục và cục bộ trong Bash
-
Cách đọc dữ liệu đầu vào từ người dùng
-
Cách nạp và đọc mảng trong Bash
-
Cách so sánh số nguyên và chuỗi
-
Cách kiểm tra loại file trong Bash
-
Cách sử dụng vòng lặp
for,whilevàuntil -
Cách định nghĩa và sử dụng hàm trong Bash
-
Cách sử dụng câu lệnh
if -
Cách sử dụng câu lệnh
case -
Cách sử dụng dấu ngoặc kép và ký tự đặc biệt trong Bash
-
Cách thực hiện phép tính số học trong Bash
-
Cách sử dụng chuyển hướng đầu ra trong Bash
Yêu cầu phần mềm và quy ước dòng lệnh Linux
| Danh mục | Yêu cầu, Quy ước hoặc Phiên bản phần mềm được sử dụng |
|---|---|
| Hệ thống | Hệ điều hành Linux |
| Phần mềm | Bash shell (được cài sẵn theo mặc định) |
| Khác | Quyền truy cập với đặc quyền root hoặc sử dụng lệnh sudo |
-
#– yêu cầu thực hiện lệnh với quyền root (trực tiếp dưới quyền root hoặc dùngsudo) -
$– thực hiện lệnh như người dùng bình thường (không có đặc quyền)
Hello World Bash Script – Hướng dẫn Bash Scripting
Bước 1: Xác định vị trí trình thông dịch Bash
Trước hết, bạn cần kiểm tra trình thông dịch Bash nằm ở đâu. Nhập lệnh sau trong dòng lệnh:
Kết quả cho thấy Bash shell nằm ở đường dẫn /bin/bash. Thông tin này sẽ dùng ngay sau đây.
phuonglh@ubuntusvr01:~$ which bash /bin/bash
/usr/bin/bash
/bin/bash
Bước 2: Tạo file script
Tiếp theo, mở trình soạn thảo văn bản mà bạn yêu thích và tạo một file có tên là hello_world.sh. Ví dụ, chúng ta dùng nano:
Bước 3: Nhập nội dung sau và lưu lại:
Shebang là gì?
Mỗi Bash script trong hướng dẫn này đều bắt đầu bằng một dòng gọi là shebang:
Dòng này không phải là chú thích, mà là nơi chỉ định chương trình sẽ dùng để thực thi script — trong trường hợp này là Bash.
Bước 4: Cấp quyền thực thi cho file script
Đi đến thư mục chứa file hello_world.sh và thực hiện:
Bước 5: Thực thi Bash script
Kết quả bạn nhận được sẽ là:
Biến toàn cục và biến cục bộ trong Bash
Trong Bash scripting:
-
Biến toàn cục (global variable): Có thể được sử dụng ở bất cứ đâu trong toàn bộ script.
-
Biến cục bộ (local variable): Chỉ có hiệu lực trong hàm (function) nơi nó được khai báo.
Ví dụ:
Kết quả khi thực thi script:
Lưu ý: locallà từ khóa dành riêng trong Bash để khai báo biến cục bộ. Như bạn thấy, giá trị biến toàn cục không bị thay đổi bởi giá trị bên trong hàm.
Truyền đối số vào Bash Script
Khi chạy một Bash script, bạn có thể truyền đối số (tham số) từ dòng lệnh. Dưới đây là một ví dụ cho thấy cách script có thể xử lý các đối số đó:
#!/bin/bash
# Sử dụng các biến định sẵn để truy cập đối số
# In các đối số ra màn hình
echo $1 $2 $3 ' -> echo $1 $2 $3'
# Cũng có thể lưu đối số vào một mảng đặc biệt
args=("$@")
echo ${args[0]} ${args[1]} ${args[2]} ' -> args=("$@"); echo ${args[0]} ${args[1]} ${args[2]}'
# In tất cả các đối số một lúc
echo $@ ' -> echo $@'
# In ra số lượng đối số
echo "Số lượng đối số truyền vào: $# -> echo $#"
Ví dụ khi chạy script với 3 đối số:
Kết quả:
Kết quả:
$ ./subshell.sh
Dòng đầu sử dụng $(uname -o) sẽ chạy lệnh và in kết quả thực tế. Dòng thứ hai chỉ in nguyên văn dòng chữ uname -o.
Đọc dữ liệu người dùng
Bạn có thể dùng lệnh read để thu nhận đầu vào từ người dùng. Điều này giúp script tương tác linh hoạt hơn.
Ví dụ:
#!/bin/bash
echo -e "Hello, please type a word: \c"
read word
echo "The word you entered is: $word"
echo -e "Please type two words: "
read word1 word2
echo "You have entered: \"$word1\" \"$word2\""
echo -e "How do you feel about bash scripting?"
read
echo "You answer: $REPLY – sounds great!"
echo -e "What is your favorite color? (enter multiple colors separated by spaces)"
read -a colours
echo "I also like the colors: ${colours[0]}, ${colours[1]} and ${colours[2]} :-)"
Kết quả khi chạy:
Lệnh trap trong Bash
Lệnh trap được dùng trong Bash script để bắt các tín hiệu (signals) gửi đến script, và thực thi một hàm con (subroutine) khi các tín hiệu đó xảy ra.
Ví dụ bên dưới sẽ phát hiện khi người dùng nhấn Ctrl + C (gửi tín hiệu INT).
#!/bin/bash
# Lệnh trap để gọi hàm bashtrap khi có tín hiệu INT
trap bashtrap INT
# Lệnh xóa màn hình
clear
# Định nghĩa hàm bashtrap sẽ chạy khi Ctrl+C được nhấn
bashtrap() {
echo "Phát hiện CTRL+C!... Đang chạy trap!"
}
# Vòng lặp từ 1 đến 10
for a in `seq 1 10`; do
echo "$a/10 để thoát."
sleep 1
done
echo "Thoát khỏi ví dụ Bash Trap!"
Kết quả khi thực thi:
Lưu ý: Mặc dù Ctrl + C được nhấn hai lần, script vẫn không bị dừng vì trap đã xử lý tín hiệu đó.
Mảng trong Bash Script
Bash hỗ trợ lưu trữ giá trị trong mảng. Dưới đây là hai ví dụ:
1. Khai báo mảng đơn giản
Ví dụ này tạo một mảng gồm 4 phần tử:
#!/bin/bash
# Khai báo mảng với 4 phần tử
ARRAY=('Debian Linux' 'Redhat Linux' 'Ubuntu' 'Linux')
# Lấy số phần tử trong mảng
ELEMENTS=${#ARRAY[@]}
# In từng phần tử của mảng ra màn hình bằng vòng lặp for
for (( i=0; i<$ELEMENTS; i++ )); do
echo ${ARRAY[$i]}
done
Kết quả khi thực thi:
Hàm trong Bash
Bash cho phép bạn định nghĩa các hàm (functions) để tái sử dụng các khối codes. Bạn có thể định nghĩa hàm ở bất kỳ đâu trong script và gọi nó ở bất kỳ chỗ nào sau đó trong Bash.
Ví dụ: Định nghĩa và gọi hàm
Kết quả khi chạy:
Lệnh select trong Bash
Lệnh select cho phép tạo menu lựa chọn để người dùng chọn một giá trị từ danh sách.
Ví dụ: Menu chọn một từ
Kết quả khi chạy:
Dòng PS3 giúp thay đổi nội dung câu hỏi xuất hiện khi người dùng được yêu cầu chọn. Dòng break đảm bảo vòng lặp select chỉ chạy một lần.
Câu lệnh case trong Bash
Câu lệnh case giúp xử lý nhiều lựa chọn dễ dàng và gọn gàng hơn so với việc dùng nhiều lệnh điều kiện if/elif/else.
Ví dụ: Chọn ngôn ngữ lập trình yêu thích
Kết quả khi chạy:
Câu lệnh case cực kỳ hữu ích khi bạn cần kiểm tra nhiều giá trị đầu vào mà không muốn dùng nhiều dòng lệnh điều kiện if.
Dấu ngoặc và ký tự đặc biệt trong Bash
Việc hiểu cách sử dụng dấu ngoặc đơn ', dấu ngoặc kép " và ký tự đặc biệt là rất quan trọng trong việc viết Bash script hiệu quả.
1. Ký tự escape (\) – loại bỏ ý nghĩa đặc biệt
Dùng \ để vô hiệu hóa (escape) ý nghĩa đặc biệt của các ký tự meta, giúp chúng được đọc theo nghĩa đen.
Kết quả:
2. Dấu ngoặc đơn ' '
Dấu ngoặc đơn sẽ vô hiệu hóa tất cả ký tự đặc biệt, kể cả $, ", và \.
Kết quả:
Không thể dùng dấu ' bên trong một cặp dấu '...' (ngay cả khi escape bằng \).
3. Dấu ngoặc kép " "
Dấu ngoặc kép cho phép thay thế biến ($) và sử dụng ký tự escape (\, `), nhưng vẫn giữ nguyên phần còn lại.
Kết quả:
Dưới đây là phần tiếp theo về Phép toán số học trong Bash (Arithmetic Operations):
Phép toán số học trong Bash
Bash hỗ trợ thực hiện các phép toán như cộng, trừ, nhân, chia, chia dư, lũy thừa…
Ví dụ: Cách tính cộng đơn giản
Chạy Script:
$ ./bash_addition_calc.sh 88 12
Kết quả:
Phép toán cơ bản với let
Mở rộng số học Bash: $(( )) và $[ ]
Làm tròn số thực trong Bash
Sử dụng printf để làm tròn số thực:
Kết quả:
Tính toán số thực với bc
Bash không hỗ trợ tính toán số thực một cách trực tiếp, nhưng bạn có thể dùng công cụ bc:
Kết quả ví dụ:
Chuyển hướng đầu ra trong Bash
Bash cho phép bạn chuyển hướng đầu ra chuẩn (STDOUT) và lỗi chuẩn (STDERR) đến các tệp hoặc lẫn nhau.
1. Chuyển STDOUT sang STDERR
Thử chạy script:
2. Chuyển STDERR sang STDOUT
Giả sử truy cập một file mà user của bạn không có quyền:
3. Chuyển hướng stdout mặc định ra màn hình
4. Ghi stdout vào file
5. Ghi stderr vào file
6. Ghi cả stdout và stderr vào cùng một file
Hoặc cách viết khác:
Kết luận
Trong hướng dẫn Bash này, bạn đã học:
-
Cách viết script cơ bản và nâng cao
-
Cách dùng biến, vòng lặp, hàm, xử lý lỗi
-
Cách xử lý file, phép toán, chuỗi, và chuyển hướng đầu ra
Với những kiến thức này, bạn có thể tạo ra các Bash script tùy chỉnh để tự động hóa các tác vụ hiệu quả cho công việc của bạn trong Linux.
Ngoài ra để biết được cách tạo một script hiển thị các thông tin quan trọng của một Linux Server bạn có thể tham khảo thêm về Hướng dẫn Viết Bash Script Để Hiển Thị Thông Tin Hệ Thống Linux
Đừng quên chia sẻ nếu bạn thấy bài viết hữu ích!
Hãy theo dõi blog để cập nhật nhiều bài viết có hướng dẫn chuyên sâu hơn.
#BashScripting #HướngDẫnLậpTrìnhShell#LậpTrìnhBash#TựĐộngHóaLinux#ViếtScriptLinux#LậpTrìnhShellLinux#BashScriptChoNgườiMớiBắtĐầu








