Bash Scripting là một công cụ mạnh mẽ giúp bạn tự động hóa các quy trình và nâng cao năng suất làm việc trên máy tính. Trong bài viết này, Vietnix sẽ hướng dẫn bạn cách sử dụng Bash Scripting để thực hiện các tác vụ một cách hiệu quả và tiết kiệm thời gian.
Bash Scripting là gì?
Bash Script là một tập hợp các lệnh được viết bằng ngôn ngữ lập trình Bash và lưu trữ trong một file văn bản. Bash Script cho phép bạn tự động hóa các công việc lặp đi lặp lại trên máy tính, nhờ đó tăng hiệu quả của các hoạt động quản trị hệ thống, triển khai dữ liệu, sao lưu tự động,… Ngôn ngữ lập trình này được sử dụng phổ biến trên các hệ điều hành Unix-like như Linux và macOS.
Tại sao nên sử dụng Bash Scripting?
Bash Scripting được sử dụng rộng rãi cho nhiều mục đích khác nhau bởi tính linh hoạt và khả năng tự động hóa mạnh mẽ. Việc thành thạo Bash Scripting giúp bạn nâng cao kỹ năng sử dụng dòng lệnh. Dưới đây là những lý do bạn nên học Bash Scripting:
- Tự động hóa: Tự động hóa các tác vụ lặp đi lặp lại, tiết kiệm thời gian.
- Tùy chỉnh: Bạn có thể tạo ra các script theo ý muốn.
- Xử lý văn bản: Thực hiện các thao tác tìm kiếm, trích xuất,… trên văn bản.
- Xử lý dữ liệu: Xử lý dữ liệu đã thao tác một cách hiệu quả.
- Quản trị hệ thống: Duy trì các cấu hình và máy chủ khác nhau.
- Hiệu quả: Xử lý nhiều tác vụ phức tạp trong một script duy nhất.
Nếu như là bạn là người mới sử dụng Bash Shell, bạn có thể tham khảo về cách chạy tập lệnh bash để hiểu thêm chi tiết cho quá trình thực thi các tập lệnh.
Những khái niệm cơ bản về Bash Scripting
Để sử dụng hiệu quả Bash Scripting, bạn cần nắm vững một số khái niệm cơ bản như biến (variables), cấu trúc điều khiển (control structures), hàm (functions) và tham số (parameters). Trong đó:
- Biến: Được sử dụng để lưu trữ và thao tác với dữ liệu. Bạn có thể gán giá trị cho biến và truy cập giá trị đó sau này trong lúc viết script.
- Cấu trúc điều khiển: Như câu lệnh điều kiện (
if-else, case
) và vòng lặp (for, while
) cho phép bạn kiểm soát luồng thực thi và đưa ra quyết định trong script. - Hàm: Tạo các khối lệnh có thể được sử dụng lại nhiều lần trong script, giúp code gọn hơn và dễ bảo trì.
Tổng quan về Bash Shell và Giao diện dòng lệnh (Command Line Interface – CLI)
“Shell” là một chương trình hoạt động như một cầu nối giữa người dùng và hệ điều hành, cho phép người dùng tương tác với hệ điều hành bằng cách gõ các dòng lệnh.
Có rất nhiều loại “Shell” khác nhau như Bash, Z shell (zsh), Korn shell (ksh), C shell (csh), Fish (Friendly Interactive Shell),… Trong số đó, Bash là một trong những “Shell” phổ biến nhất, được phát triển bởi dự án mã nguồn mở GNU. Bash được viết bởi Brian Jhan Fox dựa trên phiên bản nâng cấp của chương trình Bourne Shell ‘sh’. Hầu hết các bản phân phối Linux như Ubuntu, Debian, Fedora, CentOS,… đều sử dụng Bash làm “Shell” mặc định.
Comment trong Bash
Trong Bash Scripting, comment là những dòng bắt đầu bằng dấu thăng (#). Khi viết script Bash, bạn có thể thêm comment để giải thích ý nghĩa của từng đoạn code. Trình thông dịch Bash sẽ bỏ qua các comment trong quá trình thực thi lệnh. Mặc dù comment không được thực thi nhưng rất hữu ích cho người đọc hiểu được ý tưởng và mục đích của script.
Cách thêm comment vào script Bash
Bước 1: Tạo 1 file với phần mở rộng .sh.
Bước 2: Sử dụng 1 trình soạn thảo văn bản như Nano lệnh nano, Vim trong Linux hoặc Emacs để mở file.
Bước 3: Thêm dòng sau vào đầu script, bao gồm Shebang/Hashbang (#!). Dòng này cho phép hệ thống biết rằng đây là một script Bash.
#!/bin/bash
Bước 4: Viết các dòng lệnh Bash và thêm comment để giải thích chức năng của mỗi dòng.
Bước 5: Nhấn Ctrl+S để lưu file và nhấn Ctrl+X để thoát khỏi trình soạn thảo.
Ngoài ra, bạn có thể so sánh Emacs vs Vim để có thể lựa chọn đâu là trình soạn thảo tốt nhất dành cho công việc soạn thảo của bạn
Các loại comment
Comment trong Bash có thể được phân loại như sau:
- Single-line comment: Đặt dấu # ở đầu dòng code để tạo chú thích kéo dài đến cuối dòng.
- Inline comment: Đặt dấu # ở cuối dòng code để tạo chú thích ngắn.
- Multiple-line comment: Sử dụng nhiều single-line comment để giải thích một đoạn code.
- Block comment: Sử dụng dấu “: <<‘block_comment’” và “block_comment” để tạo một khối chú thích nhiều dòng. Đây là cách thích hợp cho những chú thích dài.
Biến và kiểu dữ liệu trong Bash
Biến là thành phần quan trọng nhất trong Bash, giúp lưu trữ, đọc, truy cập và thao tác với dữ liệu trong toàn bộ script. Điểm đặc biệt của biến trong Bash là không có kiểu dữ liệu cụ thể. Điều này có nghĩa là một biến có thể chứa bất kỳ loại dữ liệu nào như chuỗi ký tự, số nguyên (integer), số thực (float),…
Khai báo và gán giá trị cho biến
Quy trình để khai báo và gán giá trị cho biến như sau:
- Chọn tên biến có ý nghĩa: Tên biến nên phản ánh rõ ràng chức năng của biến đó. Ví dụ, nếu muốn lưu trữ tên người dùng, có thể đặt tên biến là username.
- Khai báo biến: Sử dụng lệnh
declare
để khai báo biến một cách rõ ràng trong script. - Gán giá trị cho biến: Đặt giá trị cho biến đã khai báo. Bạn có thể gán chuỗi, giá trị số và giá trị boolean cho biến cụ thể.
Cú pháp đơn giản để khai báo và gán giá trị cho biến là:
declare variable1
variable1= 41
declare variable2
variable2= Linux
Lưu ý
Trong nhiều trường hợp, bạn không cần sử dụng lệnh declare. Chỉ cần gán giá trị trực tiếp cho biến là được.
Truy cập biến bằng “$”
Khi bạn muốn truy cập và xem một biến, bạn chỉ cần thêm ký hiệu $ trước tên biến cùng với lệnh echo như sau:
echo $variable1
echo $variable2
Ngoài ra, bạn cũng có thể sử dụng cú pháp ${variableName} để truy cập giá trị của biến. Cú pháp này phù hợp cho các trường hợp tên biến dễ gây nhầm lẫn.
Ví dụ:
variable=Lin
echo The website is ${variable}uxSimply
Phạm vi của biến
Trong Bash Scripting, các biến có phạm vi khác nhau. Trong số đó, 2 loại phạm vi biến nổi bật là biến toàn cục (global variable) và biến cục bộ (local variable).
- Biến toàn cục (global variable): Các biến được tạo trong Bash đều là biến toàn cục, có thể được sử dụng ở bất kỳ đâu trong script, bao gồm trong hàm, câu lệnh điều kiện và vòng lặp.
- Biến cục bộ (local variable): Các biến cục bộ chỉ có thể được sử dụng trong đoạn code hoặc hàm nơi các biến này được khai báo. Để khai báo biến cục bộ, bạn sử dụng từ khóa local trước tên biến.
Các loại biến trong Bash
Bash hỗ trợ nhiều loại biến khác nhau, mỗi loại phục vụ một mục đích cụ thể.
- Biến có sẵn (Built-in Variable): Là các biến được định nghĩa sẵn bởi Bash shell. Ví dụ:
$HOME
(thư mục home của người dùng),$PWD
(thư mục làm việc hiện tại). - Biến môi trường (Environment Variable): Lưu trữ thông tin về môi trường hệ thống. Ví dụ:
$PATH
(danh sách các thư mục chứa file thực thi). - Biến chuỗi (String Variable): Chứa dữ liệu kiểu văn bản. Ví dụ:
$name
(tên người dùng),$designation
(chức danh). - Biến mảng (Array Variable): Lưu trữ nhiều giá trị dưới dạng một mảng của Bash Array. Ví dụ:
${array[@]}
(tất cả các phần tử của mảng). - Biến đặc biệt (Special Variable): Mỗi biến đặc biệt có ý nghĩa riêng. Ví dụ:
$?
(trạng thái thoát của lệnh cuối cùng),$0
(tên của script đang chạy). - Biến boolean (Boolean Variable): Không được hỗ trợ trực tiếp trong Bash nhưng bạn có thể mô phỏng bằng cách sử dụng chuỗi (
true
hoặcfalse
) hoặc số nguyên (0 chofalse
và 1 chotrue
). - Biến HereDoc (HereDoc Variable): Sử dụng cấu trúc HereDoc để nhập văn bản nhiều dòng.
Dấu ngoặc kép trong Bash
Khi viết Bash script, bạn cần chú ý cách sử dụng dấu ngoặc kép để làm việc với chuỗi văn bản, đặc biệt là khi chuỗi có chứa khoảng trắng.
Thông thường, Bash dùng khoảng trắng để phân biệt các giá trị riêng biệt. Ví dụ, “Nguyễn Văn A” nếu không dùng dấu ngoặc kép, Bash sẽ hiểu “Nguyễn”, “Văn”, “A” là 3 giá trị riêng biệt. Vì vậy, khi bạn muốn Bash coi một chuỗi có khoảng trắng là một giá trị duy nhất, bạn hãy đặt chuỗi đó trong dấu ngoặc kép.
Dưới đây là 3 loại dấu ngoặc kép trong Bash:
1. Dấu nháy đơn (single quotes)
- Giữ nguyên giá trị của từng ký tự trong chuỗi được đặt trong dấu nháy đơn (‘ ’).
- Không mở rộng biến.
Ví dụ:
name="A"
echo 'Hello, $name!'
#Output: Hello, $name!
2. Dấu nháy kép (double quotes)
- Giữ nguyên giá trị của tất cả các ký tự trong chuỗi được đặt trong dấu nháy kép.
- Cho phép mở rộng biến.
- Các biến trong dấu nháy kép sẽ được thay thế bằng giá trị của biến đó.
Ví dụ:
name="A"
echo "Hello, $name!"
#Output: Hello, A!
3. Thoát dấu ngoặc kép (escape quotes)
- Sử dụng dấu chéo ngược (\) trước một ký tự dấu ngoặc kép trong một chuỗi được đặt trong cùng loại dấu ngoặc kép.
- Giúp ngăn chặn shell hiểu nhầm dấu ngoặc kép đó là dấu kết thúc của chuỗi, đảm bảo chuỗi của bạn được hiểu đúng như ý muốn.
Ví dụ:
echo 'I\'m here.'
#Output: I'm here.
Tham số trong Bash
Khi bạn chạy script Bash, bạn có thể truyền thêm thông tin vào script đó. Những thông tin này được gọi là tham số, giúp bạn làm cho script linh hoạt hơn và có thể thực hiện các tác vụ khác nhau tùy thuộc vào thông tin được cung cấp.
Dưới đây là một số loại tham số phổ biến:
- Tham số vị trí (positional parameter): Đây là những biến đặc biệt lưu trữ giá trị được truyền vào script theo thứ tự. Bạn có thể truy cập các tham số này bằng cách sử dụng các biến: $1, $2, $3,…
- Tham số tuỳ chọn (optional parameter): Cho phép bạn cung cấp các tùy chọn cụ thể khi chạy script, từ đó nhận được kết quả tương ứng. Các tham số này thường được xác định bằng dấu gạch ngang đơn (-) cho tùy chọn ngắn hoặc 2 dấu gạch ngang (–) cho tùy chọn dài.
- Tham số đặc biệt (special parameter): là các giá trị lưu giữ thông tin cụ thể như tên của script, trạng thái kết thúc của lệnh gần nhất và số lượng đối số được truyền vào script,…
Mở rộng (Expansion) trong Bash
Bash cung cấp nhiều tính năng để bạn thay đổi và xử lý văn bản trong script một cách linh hoạt. Đây được gọi là mở rộng Bash. Dưới đây là một số loại mở rộng thường được sử dụng trong Bash:
- Mở rộng dấu ngoặc nhọn (Brace Expansion): Cho phép tạo ra nhiều chuỗi từ 1 mẫu bằng cách sử dụng dấu ngoặc nhọn {}, giúp bạn viết các script gọn hơn. Ví dụ: file{1,2,3}.txt sẽ được khai triển thành file1.txt, file2.txt, file3.txt.
- Mở rộng dấu ngã (Tilde Expansion): Thuận tiện điều hướng đến thư mục home của người dùng bằng cách sử dụng ký tự ~.
- Mở rộng tham số (Parameter Expansion): Xác định cách truy cập giá trị của các biến trong Bash. Ví dụ:
${variable}
sẽ trả về giá trị của biến variable. - Mở rộng biến (Variable Expansion): Thay thế tên biến bằng giá trị thực tế của biến. Ví dụ:
echo $name
sẽ in ra giá trị của biến name. - Mở rộng số học (Arithmetic Expansion): Cho phép thực hiện các phép toán trong script. Cú pháp cho mở rộng này là
$((expression))
. Ví dụ:echo $((2 + 3))
sẽ in ra kết quả là 5. - Mở rộng Glob và mở rộng ký tự đại diện (Glob Expansion và Wildcard Expansion): Mở rộng glob (còn được gọi là mở rộng tên file) là khái niệm rộng hơn về việc khớp các file dựa trên các mẫu hoặc tiêu chí cụ thể bằng cách sử dụng các ký tự đại diện như ?, *, [..]. Ngược lại, mở rộng ký tự đại diện có liên quan trực tiếp đến việc sử dụng các ký tự đại diện. Ví dụ: *.txt sẽ khớp với tất cả các file có phần mở rộng là .txt.
Ngoài ra còn có các loại mở rộng khác như mở rộng shell, mở rộng lịch sử, mở rộng mảng,…
Bash I/O – Input/Output trong Bash
Khi sử dụng Bash, bạn thường cần tương tác với máy tính bằng cách nhập dữ liệu (input) và nhận kết quả (output). Bash I/O cung cấp các cơ chế để xử lý input và output một cách linh hoạt.
Luồng dữ liệu chuẩn trong Bash (stdin, stdout, stderr)
Luồng là dòng dữ liệu liên tục, có thể nhận hoặc gửi văn bản. Đây là các kênh đặc biệt xử lý các thao tác input/output như thu thập, xử lý, chuyển hướng, nối thêm dữ liệu,…
3 mô tả file đặc biệt
Trong hệ thống Linux, mọi dữ liệu đầu vào và đầu ra được coi là file. Mỗi file này có một số thứ tự riêng gọi là mô tả file. Hệ thống cho phép mỗi tiến trình có tối đa 9 bộ mô tả file đang mở. Trong đó, Bash dành riêng 3 bộ mô tả đầu tiên với ID cụ thể.
Dưới đây là 3 luồng chuẩn với ID tương ứng (0, 1, 2) mà bạn có thể truy cập bất cứ khi nào 1 tiến trình bắt đầu:
- stdin (0): Nhận dữ liệu đầu vào từ bàn phím hoặc các lệnh khác.
- stdout (1): Hiển thị kết quả ra màn hình.
- stderr (2): Hiển thị thông báo lỗi.
Chuyển hướng (Redirection) trong Bash
Chuyển hướng trong Bash là phương pháp thay đổi nguồn đầu ra của luồng input chuẩn (stdin), luồng output chuẩn (stdout) và luồng lỗi chuẩn (stderr) một cách linh hoạt. Bash thực thi chuyển hướng để lấy dữ liệu input từ file, lưu trữ output và xử lý lỗi.
Dưới đây là một số toán tử chuyển hướng với cú pháp cơ bản:
Chuyển hướng input chuẩn (stdin) → <
Chuyển hướng input của lệnh từ 1 file thay vì nhập thủ công.
command < input_file.txt
Chuyển hướng output chuẩn (stdout) → >
- Chuyển hướng output của lệnh đến 1 file thay vì hiển thị trên màn hình.
- Ghi đè lên file nếu file đã tồn tại.
command > output_file.txt
Nối thêm vào output chuẩn (stdout) → >>
Nối thêm output của lệnh vào cuối file hiện có mà không ghi đè lên nội dung cũ.
command >> output_file.txt
Chuyển hướng lỗi chuẩn (stderr) → 2>
Chuyển hướng thông báo lỗi do lệnh tạo ra.
command 2> error.log
Nối thêm vào lỗi chuẩn (stderr) → 2>>
Nối thêm thông báo lỗi vào cuối file hiện có mà không ghi đè lên nội dung cũ.
command 2>> error.log
Chuyển hướng cả stdout và stderr
Chuyển hướng cả output và lỗi bằng cách sử dụng ký hiệu &>, >& hoặc 2>&1.
command 2>&1 > output.log
Nối thêm cả stdout và stderr
Nối thêm cả output và lỗi vào cuối file hiện có mà không ghi đè lên nội dung cũ bằng cách sử dụng ký hiệu >>.
command 2>&1 >> output.log
Piping trong Bash
Piping là một cách để kết nối các lệnh lại với nhau thành một chuỗi bằng cách sử dụng dấu |. Bash Piping cho phép bạn lấy output của một lệnh làm input cho lệnh tiếp theo.
Cú pháp cơ bản:
Command 1 | Command 2 | Command 3
Toán tử trong Bash
Khi viết script Bash, bạn thường sử dụng các toán tử để thực hiện các phép tính, so sánh và kiểm tra điều kiện trên giá trị, biến hay nhiều loại biểu thức. Việc sử dụng toán tử logic trong Bash phù hợp giúp bạn xây dựng logic cho script một cách hiệu quả. Dưới đây là các loại toán tử phổ biến trong Bash:
1. Toán tử số học: Thực hiện các phép toán toán học đơn giản.
- Cộng (+): a + b
- Trừ (-): a – b
- Nhân (*): a * b
- Chia (/): a / b
- Phép chia lấy số dư (%): a % b
- Lũy thừa (**): a ** b
2. Toán tử logic/boolean: Thực hiện các phép toán logic.
- Toán tử logic
AND (&&)
: biểu_thức 1 && biểu_thức_2 (Đúng nếu cả 2 biểu thức đều đúng). - Toán tử logic
OR (||)
: biểu_thức_1 || biểu_thức_2 (Đúng nếu ít nhất 1 trong 2 biểu thức đúng). - Toán tử logic
NOT (!)
: ! biểu_thức (Đảo ngược kết quả của biểu thức).
3. Toán tử so sánh: So sánh các biểu thức và đánh giá mối quan hệ giữa chúng. Toán tử này thường được sử dụng trong câu điều kiện và vòng lặp.
- Bằng (-eq):
a -eq b
- Khác, không bằng nhau (-ne):
a -ne b
- Nhỏ hơn (-lt):
a -lt b
- Nhỏ hơn hoặc bằng (-le):
a -le b
- Lớn hơn (-gt):
a -gt b
- Lớn hơn hoặc bằng (-ge):
a -ge b
4. Toán tử chuỗi: Thao tác và so sánh các chuỗi.
- Bằng (=): chuỗi_1 = chuỗi_2
- Khác, không bằng nhau (!=): chuỗi_1 != chuỗi_2
- Chuỗi rỗng (-z): -z chuỗi (Kiểm tra xem chuỗi có rỗng hay không)
- Chuỗi không rỗng (-n): -n chuỗi (Kiểm tra xem chuỗi có chứa ký tự nào hay không)
- Nối chuỗi (str1$str2): chuỗi_1$chuỗi_2
5. Toán tử một ngôi: Thực hiện các phép toán cụ thể trên một giá trị hoặc toán hạng duy nhất.
- Tăng lên 1 (++): a++ (tương đương a = a + 1)
- Giảm xuống 1 (–): a– (tương đương a = a – 1)
6. Toán tử kiểm tra file: Thực hiện kiểm tra trên file và thư mục để xác định các thuộc tính. Toán tử này thường được sử dụng trong câu điều kiện để đưa ra quyết định liên quan đến file và thư mục.
- Kiểm tra sự tồn tại của file (-e): -e “tên_file”
- Kiểm tra file thông thường (-f): -f “tên_file”
- Kiểm tra file khối (-b): -b “tên_file”
- Kiểm tra file ký tự (-c): -c “tên_file”
- Kiểm tra file không rỗng (-s): -s “tên_file”
- Kiểm tra thư mục (-d): -d “tên_thư_mục”
- Kiểm tra quyền đọc (-r): -r “tên_file”
- Kiểm tra quyền ghi (-w): -w “tên_file”
- Kiểm tra quyền thực thi (-x): -x “tên_file”
Câu lệnh điều kiện trong Bash
Câu điều kiện là một phần quan trọng trong lập trình Bash, cho phép script đưa ra quyết định dựa trên các điều kiện nhất định. Bash cung cấp nhiều loại câu điều kiện bắt nguồn từ lệnh if như if
, if else
, else if (elif)
,… Mỗi loại câu điều kiện đều có cấu trúc riêng, phù hợp với các tình huống khác nhau.
Dưới đây là bảng tổng hợp các loại câu lệnh điều kiện với cấu trúc đơn giản:
Câu lệnh điều kiện | Cấu trúc đơn giản | Mô tả |
---|---|---|
if | if [ condition ]; then#Code to executefi | Cấu trúc này dùng để kiểm tra 1 điều kiện. Nếu điều kiện đúng, đoạn code bên trong khối if sẽ được thực thi. |
if lồng nhau | if [ condition ]; thenif [ another_condition ]; then#Code to executefifi | Cấu trúc này sử dụng câu điều kiện if lồng nhau để kiểm tra nhiều điều kiện cùng lúc. |
if else | if [ condition ]; then#Code to executeelse#Another code to executefi | Cấu trúc này sẽ kiểm tra 1 điều kiện. Nếu điều kiện đúng, đoạn code trong khối if được thực thi. Nếu điều kiện sai, code trong khối else được thực thi. |
else if | if [ condition ]; then#Code to executeelif [ another_condition ]; then#Code to executeelse#Code to executefi | Cấu trúc này sẽ kiểm tra nhiều điều kiện theo thứ tự. Đoạn code của khối elif đầu tiên có điều kiện đúng sẽ được thực thi. Nếu không có điều kiện nào đúng, code trong khối else (nếu có) sẽ được thực thi. |
case | case “$variable” inpattern1)#Write code when pattern1 matches;;pattern2)#Write code when pattern2 matches;;*)#Write code when no patterns match;;esac | Cấu trúc này dùng để so sánh 1 biến với nhiều mẫu khác nhau. Đoạn code tương ứng với mẫu khớp sẽ được thực thi. |
Vòng lặp trong Bash
Trong lập trình Bash, vòng lặp không thể thiếu trong việc tự động hóa các tác vụ cần lặp lại nhiều lần. Thay vì phải viết đi viết lại cùng một đoạn code, bạn có thể sử dụng vòng lặp để thực thi đoạn code đó một cách hiệu quả và linh hoạt.
Cấu trúc vòng lặp cơ bản
Bash cung cấp 3 loại vòng lặp chính:
1. Vòng lặp for
Vòng lặp for được sử dụng để lặp qua một chuỗi các giá trị như mảng, dãy số hoặc danh sách các mục.
Cú pháp cơ bản như sau:
for variable in values;
do
#Command
done
2. Vòng lặp while
Đây là một trong những vòng lặp dễ sử dụng nhất trong Bash. Vòng lặp while thực thi một tập lệnh lặp đi lặp lại cho tới khi điều kiện được chỉ định vẫn đúng.
Cú pháp cơ bản như sau:
while [ condition ];
do
#Command
done
3. Vòng lặp until
Vòng lặp until hoạt động tương tự như vòng lặp while, nhưng vòng lặp until thực thi tập lệnh lặp đi lặp lại cho đến khi điều kiện được chỉ định trở thành đúng.
Cú pháp cơ bản như sau:
until [ condition ];
do
#Command
done
Câu lệnh điều khiển vòng lặp
Ngoài 3 cấu trúc vòng lặp cơ bản ở trên, Bash còn cung cấp các câu lệnh điều khiển vòng lặp, cho phép bạn thay đổi luồng thực thi của vòng lặp như sau:
- break: Câu lệnh break dùng để thoát khỏi vòng lặp ngay lập tức khi một điều kiện cụ thể được đáp ứng.
- continue: Câu lệnh continue yêu cầu Bash ngừng thực thi vòng lặp hiện tại và chuyển sang vòng lặp tiếp theo.
- exit: Câu lệnh exit kết thúc toàn bộ script Bash.
Mảng trong Bash
Trong lập trình Bash, mảng là một cấu trúc dữ liệu cho phép bạn lưu trữ nhiều giá trị dưới một biến duy nhất. Mỗi giá trị trong được gọi là một phần tử.
Đặc điểm của mảng trong Bash:
- Bạn có thể sử dụng bất kỳ biến nào làm mảng trong Bash.
- Các phần tử trong mảng không nhất thiết phải cùng kiểu dữ liệu.
- Bash hỗ trợ cả mảng kết hợp (sử dụng chuỗi làm chỉ mục) và mảng được lập chỉ mục (sử dụng số nguyên làm chỉ mục: 0, 1, 2, 3,…).
- Bạn không bị giới hạn về số lượng phần tử trong mảng.
- Mảng đánh số từ 0, tức phần tử đầu tiên có chỉ số là 0.
Lợi ích của việc sử dụng mảng:
- Mảng giúp bạn tổ chức và quản lý tập hợp dữ liệu một cách hiệu quả.
- Bạn có thể dễ dàng lấy các phần tử trong mảng bằng chỉ mục.
- Mảng giúp bạn thực hiện các thao tác trên dữ liệu trong mảng một cách dễ dàng như sắp xếp, tìm kiếm và lọc.
Cách sử dụng mảng trong Bash:
- Khai báo mảng: Sử dụng lệnh declare để khai báo mảng một cách rõ ràng.
- In các phần tử mảng: Sau khi khai báo mảng, bạn sử dụng cú pháp ‘${array_name[@]}’ để in và hiển thị tất cả các phần tử mảng, cách nhau bởi dấu cách. Trong đó ‘[@]’ đại diện cho chỉ số của mảng.
- Lặp qua mảng: Sử dụng vòng lặp để lặp qua từng phần tử của mảng.
- Thêm phần tử: Gán giá trị cho một chỉ mục mới trong mảng.
- Xóa phần tử: Sử dụng lệnh unset với chỉ mục của phần tử cần xóa.
Chuỗi trong Bash
Trong lập trình Bash, chuỗi là kiểu dữ liệu cơ bản dùng để lưu trữ dữ liệu dạng văn bản, bao gồm một dãy các ký tự, bao gồm chữ cái, số, dấu cách và các ký tự đặc biệt. Bạn có thể sử dụng dấu nháy đơn (‘) hoặc dấu nháy kép (“) để biểu diễn chuỗi trong Bash.
Chuỗi là một phần quan trọng trong xử lý dữ liệu văn bản, cho phép bạn thực hiện các thao tác như nhận input từ người dùng, lưu trữ thông tin đường dẫn, thao tác và so sánh chuỗi.
Dưới đây là một số thao tác với chuỗi cơ bản trong Bash:
- Định nghĩa chuỗi: Bạn sử dụng dấu nháy đơn hoặc nháy kép để có thể định nghĩa chuỗi. Hoặc bạn có thể bỏ qua dấu nháy, nhưng không được có khoảng trắng đứng trước hoặc sau dầu bằng (=).
- Đọc chuỗi từ người dùng: Sử dụng lệnh read, bạn có thể đọc chuỗi được nhập của người dùng.
- Nối chuỗi: Bạn có thể thực hiện nối chuỗi bằng cách sử dụng toán tử ‘+’ hoặc liệt kê các chuỗi theo thứ tự.
- Độ dài chuỗi: Bạn có thể tìm độ dài của một chuỗi bằng cách đặt toán tử ‘#’ bên trong mở rộng tham số (ngoặc nhọn) trước tên biến như ‘${#variable}’. > – Trích xuất chuỗi con: Cú pháp ‘${string:start:length}’ có thể giúp bạn trích xuất một chuỗi con từ một chuỗi.
- So sánh chuỗi: Bằng cách sử dụng các toán tử so sánh, bạn có thể so sánh chuỗi.
Hàm trong Bash
Trong lập trình Bash, hàm là một tập hợp các lệnh được đặt tên, cho phép bạn tái sử dụng nhiều lần trong script. Thay vì viết đi viết lại cùng một đoạn code, bạn có thể gói gọn chúng trong một hàm và gọi hàm đó mỗi khi cần.
Lợi ích của việc sử dụng hàm:
- Tăng khả năng tái sử dụng: Bạn viết một lần, sử dụng nhiều lần, giúp tiết kiệm thời gian và công sức.
- Cải thiện cấu trúc code: Hàm giúp chia nhỏ code thành các phần logic, dễ đọc, dễ hiểu và dễ bảo trì hơn.
- Giảm thiểu lỗi: Bạn có thể tập trung sửa lỗi ở một nơi duy nhất (trong hàm) thay vì nhiều nơi trong code.
Cách khai báo hàm
Bạn có thể khai báo hàm trong Bash theo 2 cách sau:
Cách 1: Đây là cách được sử dụng phổ biến.
function_name () {
commands
}
Cách 2: Sử dụng từ khóa function.
function function_name {
commands
}
Cách gọi hàm
Khi bạn khai báo hàm không đồng nghĩa với việc thực thi hàm. Hàm chỉ được thực thi khi được gọi sau khi khai báo. Để gọi hàm, bạn chỉ cần viết tên hàm. Lúc này, đoạn code bên trong hàm mới bắt đầu được thực thi.
Truyền tham số cho hàm
Bạn có thể truyền dữ liệu cho hàm thông qua các tham số.
- Cách truyền: Bạn liệt kê các tham số sau tên hàm, cách nhau bởi dấu cách. Ngoài ra, bạn có thể sử dụng các tham số trong dấu ngoặc kép để tránh lỗi không mong muốn trong script Bash.
- Cách truy cập: Bạn sử dụng các biến đặc biệt $0, $1, $2 , $*, $@, $# ,… để truy cập các tham số tương ứng bên trong hàm.
Giá trị trả về của hàm
Theo mặc định, hàm Bash trả về trạng thái thoát (exit status) của lệnh cuối cùng được thực thi trong hàm để xác minh xem hàm đã được thực thi thành công hay không. Bạn có thể sử dụng từ khóa return và biến đặc biệt $? để trả về một giá trị cụ thể từ hàm.
File và thư mục trong Bash
Trong Bash scripting, làm việc với file và thư mục là một tác vụ rất phổ biến. File là đơn vị lưu trữ dữ liệu cơ bản, bao gồm văn bản, chương trình, dữ liệu nhị phân, cấu hình,… Hãy cùng Vietnix tìm hiểu các thông tin quan trọng về file và thư mục trong Bash ngay sau đây.
Hệ thống file là gì?
Hệ thống file trong Bash được tổ chức theo cấu trúc cây thư mục, bao gồm các file và thư mục con. Dưới đây là hình minh hoạ 1 cấu trúc hệ thống file phân cấp:
Các loại file
Bash hỗ trợ nhiều loại file khác nhau. Dưới đây là một số loại file phổ biến:
- File thông thường (-): Chứa dữ liệu, văn bản, hình ảnh,…
- File đặc biệt: Cung cấp quyền truy cập vào phần cứng. Ví dụ: file thiết bị, socket, named pipe,…
- Liên kết tượng trưng (l): Trỏ đến 1 file hoặc thư mục khác.
- Thư mục (d): Chứa các file thông thường và file đặc biệt, tạo thành cấu trúc phân cấp.
Lưu ý
Bạn có thể sử dụng lệnh file để xem loại của 1 file.
Các thao tác điều hướng
Dưới đây là một số lệnh thường được sử dụng để thực hiện các thao tác điều hướng trên file và thư mục trong Bash:
- Lệnh cd: Thay đổi thư mục hiện tại.
- Lệnh ls: Liệt kê các file.
- Lệnh cat: Hiển thị nội dung của file.
- Lệnh touch: Tạo file mới (hoặc cập nhật thời gian sửa đổi nếu file đã tồn tại).
- Lệnh mkdir: Tạo thư mục mới.
- Lệnh copy: Sao chép file và thư mục.
- Lệnh mv: Di chuyển hoặc đổi tên file và thư mục.
- Lệnh rename file : Đổi tên file.
- Lệnh rm: Xóa file và thư mục.
- Lệnh rmdir: Xóa file và thư mục rỗng.
Quyền truy cập file
Trong các hệ thống Linux, quyền truy cập file là tính năng quan trọng để bảo mật hệ thống. Quyền truy cập quy định ai có thể đọc, ghi hoặc thực thi file hoặc thư mục.
Danh mục quyền sở hữu
3 loại người dùng chính trong Linux đó là:
- Chủ sở hữu/Người dùng (Owner/User): Người tạo hoặc sở hữu file/thư mục.
- Nhóm (Group): Nhóm người dùng có chung quyền truy cập vào file/thư mục.
- Người khác (Others): Bất kỳ người dùng nào không phải là chủ sở hữu hoặc thuộc nhóm.
3 loại quyền truy cập
Đối với mỗi loại quyền sở hữu, chúng ta sẽ có 3 loại quyền đối với file:
- Đọc (Read – r): Cho phép xem nội dung file/danh sách file trong thư mục.
- Ghi (Write – w): Cho phép sửa đổi nội dung file, thêm, xóa file trong thư mục.
- Thực thi (Execute – x): Cho phép chạy chạy như một chương trình/truy cập vào thư mục.
Thay đổi quyền truy cập
Bạn có thể dễ dàng thay đổi quyền truy cập file bằng lệnh chmod (change mode). Để chỉ định quyền truy cập, bạn có thể sử dụng dạng ký tự hoặc dạng số.
Sử dụng dạng ký tự
Bạn có thể sử dụng các ký tự u (user), g (group), o (others), a (all), + (thêm quyền), – (bỏ quyền), = (thiết lập quyền),…
Ví dụ:
chmod u+x, o+rw file.txt
Giải thích:
- chmod: Thay đổi quyền truy cập file.
- u+x, o+rw: Thêm quyền thực thi (x) cho user (u) và quyền đọc ghi (rw) cho other.
- file.txt: Tên file.
Sử dụng dạng số
Bạn có thể sử dụng các số từ 0 đến 7 để biểu diễn quyền truy cập.
Ví dụ:
chmod 644 file.txt
Giải thích:
Quyền truy cập 644 cho phép chủ sở hữu đọc và sửa đổi tệp, nhưng chỉ cho phép người khác đọc file.
Phần mở rộng file
Phần mở rộng file là phần sau dấu chấm (.) trong tên file, cho biết loại file và chương trình mặc định để mở file đó. Dưới đây là một số phần mở rộng phổ biến:
- .txt: File văn bản.
- .sh: File script shell.
- .log: File log.
- .conf: File cấu hình.
Xử lý lỗi trong Bash
Trong Bash scripting, việc đảm bảo script chạy không gặp lỗi là vô cùng quan trọng. Nếu không xử lý lỗi phù hợp, script có thể dừng đột ngột và không cung cấp thông tin hữu ích cho người dùng, gây khó khăn cho việc gỡ lỗi.
Dưới đây là một số cách giúp bạn xử lý lỗi trong Bash hiệu quả:
- Khi chạy lệnh trong Bash, lệnh sẽ trả về một trạng thái kết thúc. Nếu trạng thái kết thúc là 0, lệnh đã chạy thành công. Nếu không, có lỗi đã xảy ra.
- Bạn có thể sử dụng câu lệnh if để kiểm tra trạng thái kết thúc của một lệnh và thực hiện các hành động khác nhau tùy theo kết quả.
- Để tự động thoát khỏi bash script khi xảy ra lỗi, bạn có thể sử dụng các tùy chọn
set -e
vàset -u
. Tùy chọnset -v
giúp hiển thị các lệnh trước khi lệnh được thực thi, giúp bạn dễ dàng gỡ lỗi. - Lệnh
trap
cho phép bạn chỉ định các hành động cần thực hiện khi xảy ra lỗi hoặc khi Bash Script kết thúc. - Thông báo lỗi là rất quan trọng để hiểu nguyên nhân của lỗi và khắc phục lỗi đó. Bạn có thể sử dụng lệnh
echo
để in thông báo lỗi ra màn hình.
Câu hỏi thường gặp
Bash scripting có thể được sử dụng để tạo các ứng dụng đồ họa không?
Có thể. Bash được biết đến như một shell được tích hợp bên trong ngôn ngữ lập trình và kết hợp Bash với các công cụ khác để tạo ra các ứng dụng đồ họa đơn giản, phức tạp.
Bash có thể được sử dụng để phát triển các ứng dụng web hoặc di động không?
Có thể. Tuy nhiên bạn không nên phát triển ứng dụng Web hay di động bới vì một số đặc tính như không phải ngôn ngữ chuyên dụng, hiệu suất khả năng mở rộng còn hạn chế.
Lời kết
Như vậy, Vietnix đã cung cấp cho bạn những thông tin về Bash Scripting. Hy vọng bài viết này đã giúp bạn hiểu rõ hơn về các khái niệm cơ bản và cách sử dụng Bash Scripting. Với kiến thức này, bạn có thể viết các script hiệu quả để tăng năng suất và đơn giản hóa công việc của mình.