NỘI DUNG

Hosting tốc độ cao Vietnix - tốc độ tải trang trung bình dưới 1 giây
VPS siêu tốc Vietnix - trải nghiệm mượt mà, ổn định
27/09/2024
Lượt xem

Tìm hiểu về Bash Scripting và cách sử dụng chi tiết

27/09/2024
35 phút đọc
Lượt xem

Đánh giá

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ư LinuxmacOS.

Bash Scripting
Bash Scripting

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)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ì.
Những khái niệm cơ bản về Bash Scripting
Những khái niệm cơ bản về Bash Scripting

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. 

Bash Shell - môi trường thực hiện tập lệnh Script
Bash Shell – môi trường thực hiện tập lệnh Script

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.
Các loại comment trong Bash
Các loại comment trong Bash

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),…

Path variable - hiểu đúng về biến Path trong Bash shell
Path variable – hiểu đúng về biến Path trong Bash shell

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

iconLư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ặc false) hoặc số nguyên (0 cho false1 cho true).
  • 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.
Bash - công cụ hữu ích tạo Script
Bash – công cụ hữu ích tạo Script

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.
3 mô tả file đặc biệt
3 mô tả file đặc biệt

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

Bash Piping
Bash Piping

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ệnCấu trúc đơn giảnMô tả
ifif [ condition ]; then#Code to executefiCấ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 nhauif [ condition ]; thenif [ another_condition ]; then#Code to executefifiCấ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 elseif [ condition ]; then#Code to executeelse#Another code to executefiCấ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 ifif [ condition ]; then#Code to executeelif [ another_condition ]; then#Code to executeelse#Code to executefiCấ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.
casecase “$variable” inpattern1)#Write code when pattern1 matches;;pattern2)#Write code when pattern2 matches;;*)#Write code when no patterns match;;esacCấ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:

File và thư mục trong Bash
File và thư mục trong Bash

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.

iconLư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:

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.
3 loại quyền truy cập trong file
3 loại quyền truy cập trong file

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 -eset -u. Tùy chọn set -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.

THEO DÕI VÀ CẬP NHẬT CHỦ ĐỀ BẠN QUAN TÂM

Đăng ký ngay để nhận những thông tin mới nhất từ blog của chúng tôi. Đừng bỏ lỡ cơ hội truy cập kiến thức và tin tức hàng ngày

Chọn chủ đề :

Hưng Nguyễn

Co-Founder
tại

Kết nối với mình qua

Kết nối với mình qua

Theo dõi
Thông báo của
guest
0 Comments
Phản hồi nội tuyến
Xem tất cả bình luận

Tăng tốc độ website - Nâng tầm giá trị thương hiệu

Tăng tốc tải trang

95 điểm

Nâng cao trải nghiệm người dùng

Tăng 8% tỷ lệ chuyển đổi

Thúc đẩy SEO, Google Ads hiệu quả

Tăng tốc ngay

SẢN PHẨM NỔI BẬT

7 NGÀY DÙNG THỬ HOSTING

NẮM BẮT CƠ HỘI, THÀNH CÔNG DẪN LỐI

Cùng trải nghiệm dịch vụ hosting tốc độ cao được hơn 100,000 khách hàng sử dụng

ĐĂNG KÝ NHẬN TÀI LIỆU THÀNH CÔNG
Cảm ơn bạn đã đăng ký nhận tài liệu mới nhất từ Vietnix!
ĐÓNG

ĐĂNG KÝ DÙNG THỬ HOSTING

7 NGÀY MIỄN PHÍ

ĐĂNG KÝ DÙNG THỬ HOSTING

7 NGÀY MIỄN PHÍ

XÁC NHẬN ĐĂNG KÝ DÙNG THỬ THÀNH CÔNG
Cảm ơn bạn đã đăng ký thông tin thành công. Đội ngũ CSKH sẽ liên hệ trực tiếp để kích hoạt dịch vụ cho bạn nhanh nhất!
ĐÓNG