🌱 Bash Basic - Một số khái niệm cơ bản trong Bash Script
Đối với các ngôn ngữ Script thì có lẽ không cần đi quá sâu vào từng khái niệm, bạn cần biết đến chúng, quên chúng đi, và khi nào sử dụng thì có thể xem lại! (Một phần nữa thì mình muốn tập trung các bài viết về Embedded System trên blog này nhiều hơn). Bài viết này sẽ nói về một số khái niệm cơ bản trong Bash Script:
Mục lục
File System và Permission
File System là một loại cấu trúc được tổ chức với tập hợp các file hoặc folder. Nó xác định quyền kiểm soát dữ liệu, tức là dữ liệu sẽ được lưu trữ và truy xuất như thế nào?
Liệt kê tất cả các tệp và thư mục bằng cách sử dụng lệnh "ls -l".
- Cột đầu tiên biểu thị loại file và quyền truy cập file. Mỗi hàng bắt đầu bằng loại file và sau đó chỉ định quyền truy cập được liên kế t với các tệp. Dưới đây là các loại file với các ký tự cụ thể của chúng:
- Regular file (-)
- Directory (d)
- Link (l)
- Special File (c)
- Socket (s)
- Named pipe (p)
- Block device (b)
- Cột thứ hai biểu thị số memory blocks.
- Cột thứ ba biểu thị chủ sở hữu file hoặc người có quyền quản trị.
- Cột thứ tư biểu thị nhóm chủ sở hữu.
- Cột thứ năm biểu thị kích thước file .
- Cột thứ sáu biểu thị ngày và giờ file được tạo hoặc sửa đổi lần cuối.
- Cột cuối cùng biểu thị tên file hoặc folder.
Bạn có thể thay đổi quyền truy cập file (read / write / execute) cho từng class, nhưng việc này thường áp dụng trên hệ điều hành Linux nhiều hơn, trên Window thông thường các file thường mở full quyền.
Relative vs. Absolute path
Trước khi tạo một Bash Script đầu tiên, bạn nên biết rõ về shell navigation và sự khác biệt giữa đường dẫn tương đối (Relative Path) và tuyệt đối (Absolute Path) cho một file. Vậy chúng ta hãy cùng tìm hiểu chúng là gì?
Path - Đường dẫn là gì?
Path - Đường dẫn đến một file là dạng hợp nhất của dấu gạch chéo (/) và các ký tự chữ và số. Nó xác định vị trí duy nhất của một file hoặc folder trong file system của hệ điều hành.
Đường dẫn tuyệt đối - Absolute Path
Đường dẫn tuyệt đối là đường dẫn đầy đủ chỉ định vị trí của file hoặc folder từ thư mục gốc (Root Directory) hoặc bắt đầu của file system thực tế.
Ví dụ: /cygdrive/d/Git_Repository/AVR_Microcontrollers/3_ATTiny13/ATTiny13_Software_UART
Đường dẫn tuyệt đối của bất kỳ thư mục nào luôn bắt đầu bằng dấu gạch chéo (/) biểu thị gốc thư mục. Bên cạnh đó, tất cả các dấu gạch chéo trong đường dẫn thư mục đều phân tách các thư mục.
- Tất cả tên thư mục trong đường dẫn tuyệt đối đều được viết theo thứ tự phân cấp. Tên thư mục cha được viết ở bên trái.
- Đường dẫn tuyệt đối của thư mục hiện tại có thể được xác định bằng lệnh pwd.
Đường dẫn tương đối - Relative Path
Đường dẫn tương đối của file là vị trí của file so với thư mục làm việc hiện tại. Đường dẫn này không bao giờ bắt đầu bằng dấu gạch chéo (/). Đường dẫn này bắt đầu bằng thư mục làm việc đang diễn ra.
Ví dụ: 3_ATTiny13/ATTiny13_Software_UART
- Dấu chấm đơn (.) giải quyết thư mục hiện tại.
- Dấu chấm đôi (..) giải quyết thư mục cha của thư mục làm việc hiện tại.
- Dấu ngã (~) biểu thị thư mục gốc của người dùng đã đăng nhập.
Đường dẫn tương đối so với Đường dẫn tuyệt đối
Thư mục trên cùng trong bất kỳ hệ thống tệp nào là thư mục gốc (Root Directory) được biểu thị bằng dấu gạch chéo (/). Bạn có thể mô tả vị trí của bất kỳ file hoặc folder nào trong file system bằng đường dẫn tuyệt đối. Điều đó có nghĩa là bạn sẽ thực hiện mọi bước bắt đầu từ thư mục gốc hoặc phần đầu tuyệt đối của hệ thống tệp.
Đường dẫn tuyệt đối sẽ khá bất tiện khi chúng ta có quá nhiều folder lồng nhau, và sẽ không thể tái sử dụng khi project làm việc trên nhiều máy khác nhau (Vì đường dẫn tuyệt đối trên các máy là khác nhau). Vì vậy, bạn có thể sử dụng Đường dẫn tương đối thay thế.
Xem các ví dụ này để bạn biết đường dẫn tương đối thuận tiện hơn đường dẫn tuyệt đối như thế nào.
Relative vs. Absolute path |
Bash Comment
Comment luôn là yếu tố cần thiết để làm chương trình rõ ràng hơn, dễ đọc và maintain hơn với bất kỳ ngôn ngữ lập trình nào.
Bash Script hỗ trợ hai loại comment, giống như ngôn ngữ lập trình khác.
- Single Line Comment
- Multiple Line Comment
Single Line Comment
Để viết Comment single line trong bash, chúng ta phải sử dụng ký hiệu thăng (#) ở đầu comment. Ví dụ:
- #!/bin/bash
- #This is a single-line comment in Bash Script.
- echo "Enter your name:"
- read $name
- echo
- #echo output, its also a single line comment
- echo "The current user name is $name"
- #This is another single line comment
➥ Output, nhớ chạy trên Git Bash hoặc Cygwin trên Windows!
Multiple Line Comment
Có hai cách để chèn comment nhiều dòng trong bash:
- Đặt bình luận giữa <<COMMENT và COMMENT.
- #!/bin/bash
- <<COMMENTS
- This is the first comment
- This is the second comment
- This is the third comment
- COMMENTS
- echo "Hello World"
- Đặt bình luận giữa (: ') và dấu nháy đơn (') - Chú ý có dấu cách giữa dấu hai chấm và nháy đơn!
- #!/bin/bash
- : '
- This is the first comment
- This is the second comment
- This is the third comment
- '
- echo "Hello World"
Quotes - Trích dẫn trong Bash
Với Bash, khi chúng ta muốn các biến lưu trữ các giá trị phức tạp hơn, chúng ta cần sử dụng trích dẫn (Quotes). Trích dẫn được sử dụng để xử lý văn bản và tên tệp có ký tự khoảng trắng. Đó là vì Bash sử dụng khoảng trắng để xác định các mục riêng biệt.
Khi nội dung được đặt trong trích dẫn, chúng ta đang chỉ ra cho Bash rằng nội dung trong trích dẫn nên được coi là một mục duy nhất. Đọc ví dụ sau để hiểu cách sử dụng single quote và double quote:
Quote with String
Khi làm việc với văn bản đơn giản và chuỗi, sẽ không có sự khác biệt nào giữa việc chúng ta sử dụng single quote và double quote.
- #!/bin/bash
- # String in single quote
- echo 'Hello User'
- echo
- # String in double quote
- echo "I am Taarabt"
Quote with Variable
Việc mở rộng biến shell chỉ hoạt động với double quote. Nếu bạn định nghĩa bất kỳ biến nào trong single quote, thì nó sẽ không được coi là một biến. Hãy cùng tìm hiểu điều này qua ví dụ sau:
- #!/bin/bash
- name="You are welcome at Lap trinh Dien tu"
- echo double quote - "$name"
- echo single quote - '$name'
Kết quả, chỉ có dòng double quote lấy được giá trị của biến:
Variable - Biến và Data Type - Kiểu dữ liệu trong Bash
Biến là phần thiết yếu của bất cứ ngôn ngữ lập trình nào. Biến chỉ định vị trí bộ nhớ thông qua các ký tự, số và chữ số. Chúng được sử dụng để tham chiếu và thao tác trong chương trình máy tính. Biến là các vùng chứa lưu trữ dữ liệu hoặc thông tin hữu ích dưới dạng giá trị bên trong chúng. Sau đây là cú pháp cho một biến:
Biến được biết đến là bộ nhớ tạm thời cho bất kỳ loại dữ liệu nào như số nguyên, số thực, ký tự, v.v. Tên biến có thể bao gồm chữ cái, chữ số và dấu gạch dưới và tên của biến chỉ có thể bắt đầu bằng chữ cái và dấu gạch dưới.
Variable trong Bash
➤ Cú pháp khai báo biến trong Bash:
Variable_name=value
Quy tắc được đặt ra để định nghĩa Biến Bash:
- Thêm tiền tố đô la ($) vào tên biến khi đọc hoặc in một biến.
- Bỏ dấu đô la ($) khi đặt bất kỳ giá trị nào cho biến.
- Tên biến có thể là chữ cái và số hoặc có thể được viết bằng dấu gạch dưới (_).
- Tên biến phân biệt chữ hoa chữ thường: x và X được coi là hai biến khác nhau.
- Tên biến có thể được viết bằng chữ HOA hoặc CHỮ THƯỜNG hoặc kết hợp cả hai tùy ý bạn.
- Biến có thể được đặt ở bất kỳ đâu trong Bash Script hoặc trên dòng lệnh, vì khi chạy, Bash sẽ thay thế biến đó bằng giá trị được gán. Điều này trở nên khả thi vì thực hiện phép thay thế trước khi chạy lệnh.
- Không nên có khoảng trắng ở cả hai bên dấu bằng (=) giữa tên biến và giá trị của nó. Sau đây là một số ví dụ về Biến không hợp lệ có khoảng trắng (được biểu thị bằng dấu chấm ...) giữa chúng như được đưa ra bên dưới:
- var1=...variable1
- var2...=variable2
- var3...=...variable3
- Không cần sử dụng bất kỳ dấu quote nào, dù là single quote hay double quote, để định nghĩa một biến có giá trị ký tự đơn như var1=variable. Để nhập nhiều từ hoặc Chuỗi dưới dạng một mục duy nhất trong một biến, hãy sử dụng dấu double quote để bao quanh nội dung của bạn trong biến đó.
- Dấu ngoặc kép đơn ('') giúp xử lý mọi ký tự.
- Dấu ngoặc kép ("") giúp thực hiện phép thay thế.
Data Type trong Bash
Trong các ngôn ngữ lập trình chính thức, bạn phải định nghĩa kiểu dữ liệu của bất kỳ biến nào tại thời điểm khai báo biến. Ví dụ:
int year=2012
char comp_name='jtp'
Đối với Bash, bạn không phải định nghĩa kiểu dữ liệu của bất kỳ biến nào tại thời điểm khai báo biến. Các biến Bash không có kiểu, nghĩa là chỉ cần nhập tên biến bằng cách gán giá trị của nó và nó sẽ tự động xem xét kiểu dữ liệu đó.
Theo đó, nếu bạn gán bất kỳ giá trị số nào cho biến, nó sẽ hoạt động như số nguyên và nếu bạn gán giá trị ký tự cho biến, thì nó sẽ là Chuỗi.
year=2012
comp_name=jtp
➥ sử dụng lệnh echo, hãy đọc chúng bằng cách gán dấu $ trước tên của chúng như
echo $year
echo $name
Các loại biến Bash
Có hai loại biến trong shell hoặc bất kỳ hệ thống UNIX nào.
- System-Defined Variables
Đây là các biến được định nghĩa trước vì chúng được tạo và duy trì bởi chính hệ điều hành LINUX. Quy ước chuẩn của chúng là chúng thường được định nghĩa bằng chữ in hoa, tức là CHỮ IN HOA. Vì vậy, bất cứ khi nào bạn thấy một biến được định nghĩa bằng chữ in hoa, rất có thể đó là các biến do hệ thống định nghĩa.
- BASH=/usr/bin/bash
- BASH_VERSION=4.2.46(2)
- COLUMNS=80
- PWD=/d/Git_Repository/Embedded_TaaraTools/Bash
- User-Defined Variables
Các biến này được tạo và duy trì bởi người dùng. Nhìn chung, các loại biến này được định nghĩa theo LOWER_CASES. Không có quy tắc nghiêm ngặt nào để viết các biến này theo chữ thường. Chúng ta cũng có thể viết chúng theo chữ hoa.
Command line Arguments
Command line Arguments được sử dụng để làm cho tập lệnh trở nên linh động hơn bằng cách truyền dữ liệu đầu vào cho mã khi người dùng chạy (Cái này thì ngôn ngữ nào cũng có - bạn có thể tham khảo Argv của ngôn ngữ lập trình C).
./script_name arg1 arg2 arg3.....
Không được có khoảng trắng giữa tên tập lệnh và tất cả các tham số truyền. Trong Bash Shell, chúng được sử dụng với tham chiếu đến các tham số mặc định sau hoặc các biến đặc biệt.
- $0 chỉ định tên của tập lệnh sẽ được gọi.
- $1-$9 lưu trữ tên của 9 đối số đầu tiên hoặc có thể được sử dụng làm vị trí của các đối số.
- $# chỉ định tổng số (số lượng) đối số được truyền cho tập lệnh.
- $* lưu trữ tất cả các đối số dòng lệnh bằng cách nối chúng lại với nhau.
- $@ lưu trữ danh sách các đối số dưới dạng một mảng.
- $? chỉ định ID quy trình của tập lệnh hiện tại.
- $$ chỉ định trạng thái thoát của lệnh cuối cùng hoặc quy trình thực thi gần đây nhất.
- $! hiển thị ID của tác vụ nền cuối cùng.
Sau đây là hai phương pháp chúng ta có thể sử dụng để truyền đối số dòng lệnh:
Phương pháp 1: Sử dụng Position Number
Đây là cách đầu tiên để truy cập các đối số bằng cách sử dụng các tham số mặc định ($1...$9). Ví dụ:
- #!/bin/bash
- echo ' $0 = ' $0
- echo ' $1 = ' $1
- echo ' $3 = ' $3
Chạy Script với các tham số người dùng truyền vào, kết quả:
Phương pháp 2: Sử dụng Mảng.
Phương án này sẽ đưa toàn bộ tham số người dùng truyền vào theo một Mảng và sử dụng sau đó.
- #!/bin/bash
- args=("$@")
- echo ${args[0]} ${args[1]} ${args[2]}
Chạy Script với các tham số người dùng truyền vào, kết quả (Phương án này mảng sẽ chỉ lưu các tham số khác ngoài tên script)
Command Substitution
Theo Tài liệu chính thức của Bash
"Command Substitution allows the output of a command to replace the command itself. Bash performs the expansion by executing the command in a subshell environment and replacing the command substitution with the standard output of the command, with any trailing newlines deleted. Embedded newlines are not deleted, but they may be removed during word splitting."
Command Substitution đề cập đến việc mở rộng mà Bash thực hiện cho chúng ta. Nó lấy đầu ra của lệnh Bash, lưu trữ trong một biến (nói chung) và hiển thị lại bằng echo.
Command Substitution cung cấp tính linh hoạt về dữ liệu liên quan đến việc viết script và gán biến. Nó đơn giản và dễ dàng để có đầu ra dòng lệnh duy nhất. Trong trường hợp, đầu ra dài hơn một vài dòng, thì các dòng mới theo sau sẽ bị xóa và toàn bộ nội dung của đầu ra sẽ nằm trên một dòng duy nhất.
Xem cú pháp để sử dụng:
Dạng cổ điển để thay thế lệnh trong một biến hoặc thay thế lệnh là sử dụng dấu ngoặc kép (`...`), như được đưa ra bên dưới:
- variable_name=`command_name`
- variable_name=`command_name [option...] argument1 argument2...`
- variable_name=`/path/to/command`
Bây giờ, chúng ta thực hiện thay thế lệnh bằng cách bao quanh các lệnh trong dấu ngoặc vuông (trước đó là dấu đô la ($)). Hãy xem:
- variable_name=$(command_name)
- variable_name=$(command_name [option...] argument1 argument2...)
- variable_name=$(path/to/command)
Vì vậy, hãy thực hiện thay thế lệnh bằng một ví dụ theo thảo luận. Trong ví dụ này, chúng ta đang thay thế lệnh ls đơn lẻ trong một biến.
- #! /bin/bash
- # command substitution
- lsResult=$(ls -l)
- echo "My files are:" $lsResult
Kết quả là các file sẽ được list ra:
Trên đây là một số khái niệm cơ bản trong Bash Script, hãy nắm chắc và chạy thử các Script đầu tiên để có thể làm quen với Bash.
>>>>>> Follow ngay <<<<<<<
Để nhận được những bài học miễn phí mới nhất nhé 😊
Chúc các bạn học tập tốt 😊