Xin chào! Bài viết này là phần thứ hai của loạt bài hướng dẫn về tập lệnh Howtoforgeshell. Đến thời điểm này, tôi cho rằng bạn đã đọc phần đầu tiên của loạt bài và biết cách tạo một tập lệnh đơn giản và thực thi nó. Trong phần thứ hai, bạn sẽ học cách chấp nhận đầu vào từ người dùng và xử lý chúng thông qua tập lệnh shell. Hãy bắt đầu thôi!
Bảng dưới đây hiển thị các biến môi trường phổ biến trong shell Linux:
Để hiển thị giá trị của biến môi trường, người dùng phải thêm dấu đô la ($) vào trước biến cần truy cập. Ví dụ: để hiển thị một số thông tin hệ thống như thư mục làm việc hiện tại, người dùng đã đăng nhập và loại hệ điều hành bằng lệnh echo, chúng ta sử dụng:
Kết quả là:
Để lấy toàn bộ danh sách các biến môi trường trong Linux, hãy sử dụng lệnh env.
Ví dụ:
Kết quả của tập lệnh là:
Khi bạn chạy tập lệnh, lúc đầu, $USER trong dòng echo $USER hiển thị giá trị của biến USER. Bằng cách sử dụng toán tử gán (=), biến USER sẽ thay đổi giá trị của nó. Tuy nhiên, nếu người dùng gán các giá trị không xác định cho một biến môi trường, shell sẽ tạo một biến shell khác tương tự như biến môi trường trong ngữ cảnh cục bộ của tập lệnh nhưng nó sẽ không ảnh hưởng đến hành vi của các ứng dụng khác. Nghĩa là, sau khi tập lệnh của chúng ta đóng lại, biến USER sẽ giữ nguyên giá trị mặc định của nó.
Lưu ý rằng trong ví dụ trước, chúng ta bỏ dấu đô la ($) trong tên biến khi thao tác các giá trị của biến môi trường như dòng USER="new user". Ngoài ra, khi sử dụng toán tử gán, không được có khoảng trắng giữa dấu USER và dấu =. Thêm khoảng trắng giữa chúng sẽ tạo ra lỗi.
Dòng 2 và 3 trả về lỗi "command not found" vì biến 12abc bắt đầu bằng một ký tự số và biến abc#* chứa các ký tự không hợp lệ. Chúng tôi cũng đã chứng minh rằng _abc và _ABC là các biến khác nhau và dòng _ABC=2 không ghi đè giá trị của _abc.
Ví dụ, chúng tôi sẽ tạo một tập lệnh cho phép người dùng nhập tên và họ của mình và hiển thị chúng. Để cho người dùng biết phải làm gì, chúng ta hiển thị lời nhắc người dùng bằng lệnh echo.
Kết quả là:
Xin lưu ý rằng giống như trong ví dụ trước, chúng ta không phải khai báo biến để sử dụng biến đó. Trình thông dịch cũng tự động tạo biến được sử dụng trong lệnh read. Tuy nhiên, trong ví dụ này, chúng ta đã sử dụng lệnh echo nhiều lần để tạo lời nhắc cho người dùng. Lệnh read cũng có khả năng tạo lời nhắc trong khi chấp nhận đầu vào của người dùng. Cú pháp sử dụng dấu nhắc trong lệnh đọc là:
Để đơn giản hóa mã trước đó, chúng ta có thể xây dựng lại mã thành:
Một lợi ích khác của lệnh đọc là dấu nhắc lệnh nằm ngay sau văn bản chứ không phải ở dòng bên dưới.
Lệnh đọc cũng có thể được sử dụng để chấp nhận mật khẩu. Không giống như các đầu vào thông thường, mật khẩu được che giấu để cung cấp tính bảo mật. Cú pháp chấp nhận mật khẩu là:
Lưu ý rằng mỗi khi bạn thực hiện lệnh số học, tất cả các biến của chúng ta sẽ được bao quanh bởi dấu đô la và dấu ngoặc kép. Bằng cách này, trình thông dịch sẽ xử lý các giá trị của biến của chúng ta dưới dạng số nguyên. Nếu không có nó, trình thông dịch sẽ xử lý các giá trị của biến dưới dạng chuỗi. Để có ví dụ, hãy xem đoạn mã bên dưới:
Khi chúng ta chạy ví dụ của mình, dòng $((a+b)) sẽ thêm các giá trị của người dùng được lưu trữ trong các biến a và b tương ứng trong khi c=$a+$b xử lý các biến a và b dưới dạng chuỗi.
Cooper, M. (n.d.). Hướng dẫn viết tập lệnh Bash nâng cao. Truy cập ngày 29 tháng 4 năm 2015, từhttp://www.tldp.org/LDP/abs/html/
Biến môi trường. (n.d.). Truy cập ngày 29 tháng 4 năm 2015, từ Tài liệu Ubuntu:https://help.ubuntu.com/community/EnvironmentVariables
Biến trong Linux
Giống như các ngôn ngữ lập trình, shell Linux có khả năng lưu trữ dữ liệu trong các biến. Biến là một vùng chứa lưu trữ tạm thời dữ liệu sẽ được xử lý thông qua ngôn ngữ lập trình. Có hai loại biến trong Linux: biến môi trường và biến shell.Biến môi trường
Biến môi trường là các biến mặc định trong Linux và được sử dụng để truyền thông tin qua các quy trình trong shell. Biến môi trường phân biệt chữ hoa chữ thường và phải luôn viết hoa để có thể truy cập chúng.Bảng dưới đây hiển thị các biến môi trường phổ biến trong shell Linux:
Tên biến | Cách sử dụng |
BASH | Lưu giữ đường dẫn đầy đủ của trình thông dịch lệnh cho các tập lệnh Bash |
BASH_VERSION | Lưu giữ phiên bản phát hành bash của máy hiện đang sử dụng |
HOME | Lưu giữ tương đối đường dẫn của thư mục gốc. |
LOGNAME | Lưu trữ tên tài khoản của người dùng hiện đang đăng nhập |
OSTYPE | Lưu trữ chuỗi mô tả hệ điều hành hiện tại của máy được sử dụng |
PATH | Lưu trữ đường dẫn tuyệt đối được phân tách bằng dấu hai chấm của các tệp thực thi trong Linux |
PWD | Lưu trữ thư mục làm việc hiện tại của shell |
SHELL | Lưu trữ shell dòng lệnh được ưu tiên |
USER | Hoạt động tương tự như LOGNAME. Nó giữ tên tài khoản của người dùng hiện đang đăng nhập |
_ | Giữ tên của lệnh được sử dụng gần đây trong shell |
Mã:
#!/bin/bash
echo $PWD
echo $LOGNAME
echo $OSTYPE
Để lấy toàn bộ danh sách các biến môi trường trong Linux, hãy sử dụng lệnh env.
Thay đổi giá trị của các biến môi trường
Để cung cấp tính linh hoạt cho hệ thống, các biến môi trường này có thể được thao tác. Để đặt giá trị cho một biến môi trường, hãy sử dụng biểu thức gán (dấu bằng).Ví dụ:
Mã:
#!/bin/bash
echo $USER
USER="new user"
echo $USER
Khi bạn chạy tập lệnh, lúc đầu, $USER trong dòng echo $USER hiển thị giá trị của biến USER. Bằng cách sử dụng toán tử gán (=), biến USER sẽ thay đổi giá trị của nó. Tuy nhiên, nếu người dùng gán các giá trị không xác định cho một biến môi trường, shell sẽ tạo một biến shell khác tương tự như biến môi trường trong ngữ cảnh cục bộ của tập lệnh nhưng nó sẽ không ảnh hưởng đến hành vi của các ứng dụng khác. Nghĩa là, sau khi tập lệnh của chúng ta đóng lại, biến USER sẽ giữ nguyên giá trị mặc định của nó.
Lưu ý rằng trong ví dụ trước, chúng ta bỏ dấu đô la ($) trong tên biến khi thao tác các giá trị của biến môi trường như dòng USER="new user". Ngoài ra, khi sử dụng toán tử gán, không được có khoảng trắng giữa dấu USER và dấu =. Thêm khoảng trắng giữa chúng sẽ tạo ra lỗi.
Biến Shell
Shell cũng cho phép người dùng khai báo các biến. Giống như PHP, để khai báo một biến trong tập lệnh shell, người dùng không cần phải lo lắng về việc khai báo kiểu dữ liệu của biến đó; trình thông dịch sẽ tự động phát hiện kiểu dữ liệu của biến dựa trên dữ liệu mà người dùng lưu trữ vào trong thời gian chạy.Quy tắc đặt tên biến shell
Giống như bất kỳ ngôn ngữ lập trình nào, cũng có các quy tắc đặt tên biến shell. Sau đây tóm tắt các quy tắc:- Tên biến phải bắt đầu bằng một chữ cái hoặc dấu gạch dưới.
- Nó chỉ được chứa các ký tự chữ và số hoặc dấu gạch dưới.
- Các biến phân biệt chữ hoa chữ thường, do đó, các biến path, PATH và Path là khác nhau.
Mã:
#!/bin/bash
12abc=10
abc#*=10
_abc=10
_ABC=2
echo $12abc $abc#* $_abc $_ABC
Gán giá trị cho các biến shell bằng lệnh read:
read là lệnh cho phép chấp nhận đầu vào từ người dùng. Cú pháp khi sử dụng lệnh read là:
Mã:
read
Mã:
#!/bin/bash
echo "Your first name: "
read fname
echo "Your last name:"
read lname
echo "Hello $fname $lname ! I am learning how to create shell scripts."
Xin lưu ý rằng giống như trong ví dụ trước, chúng ta không phải khai báo biến để sử dụng biến đó. Trình thông dịch cũng tự động tạo biến được sử dụng trong lệnh read. Tuy nhiên, trong ví dụ này, chúng ta đã sử dụng lệnh echo nhiều lần để tạo lời nhắc cho người dùng. Lệnh read cũng có khả năng tạo lời nhắc trong khi chấp nhận đầu vào của người dùng. Cú pháp sử dụng dấu nhắc trong lệnh đọc là:
Mã:
read -p "Dấu nhắc của bạn: "
Mã:
#!/bin/bash
read -p "Tên của bạn: " fname
read -p "Họ của bạn: " lname
echo "Xin chào $fname $lname ! Tôi đang học cách tạo tập lệnh shell"
Lệnh đọc cũng có thể được sử dụng để chấp nhận mật khẩu. Không giống như các đầu vào thông thường, mật khẩu được che giấu để cung cấp tính bảo mật. Cú pháp chấp nhận mật khẩu là:
Mã:
read -s -p "your prompt"
Thực hiện phép tính số học đơn giản bằng shell
Ngoài việc chấp nhận đầu vào và hiển thị đầu ra, bash shell còn có tùy chọn số học tích hợp. Bảng dưới đây tóm tắt các toán tử số học tích hợp của bash shell.Toán tử | Mô tả | Cú pháp | Cách sử dụng |
+ | Phép cộng | a=$((b+c)) | Cộng giá trị của b và c và lưu vào biến a |
- | Phép trừ | a=$((b-c)) | Trừ giá trị của c khỏi b và lưu vào biến a |
* | Phép nhân | a=$((b*c)) | Nhân giá trị của b với c và lưu vào biến a |
/ | Phép chia | a=$((b/c)) | Chia giá trị của b cho c và lưu vào biến a |
% | Phép chia lấy modulo của b và c và lưu trữ nó vào biến a | ||
++ | Tăng trước | $((++aa)) | Tăng giá trị của biến a ngay lập tức |
++ | Tăng sau | $((a++)) | Tăng giá trị của biến a và phản ánh các thay đổi sang dòng tiếp theo |
-- | Giảm trước | $((--a)) | Giảm giá trị của biến a ngay lập tức |
-- | Giảm sau | $((a--)) | Giảm giá trị của biến a và phản ánh các thay đổi sang dòng tiếp theo |
** | Lũy thừa | $((a**2)) | Nâng giá trị của a lên số mũ của 2 |
+= | Cộng bằng | $((a+=b)) | Cộng giá trị của a và b và lưu trữ vào biến a |
-= | Trừ equal | $((a-=b)) | Trừ giá trị của b khỏi a và lưu trữ vào biến a |
*= | Nhân equal | $((a*=b)) | Nhân giá trị của a với b và lưu trữ vào biến a |
/= | Gạch chéo equal | $((a/=b)) | Chia giá trị của a cho b và lưu trữ vào biến a |
%= | Mod-equal | $((a%=b)) | Thực hiện phép chia modulo giữa a và b và lưu trữ phép chia này vào biến a |
Mã:
#!/bin/bash
read -p "Enter int1: " a
read -p "Enter int2: " b
echo $((a+b))
c=$a+$b
echo $c
Kết luận
Chúng ta đã đề cập đến cách chấp nhận đầu vào và lưu trữ nó trên một biến và cách thực hiện các phép toán số học trong tập lệnh bash shell. Trong phần tiếp theo, chúng ta sẽ giới thiệu các cấu trúc điều khiển và đặc biệt là cấu trúc quyết định.Tài liệu tham khảo:
Dự án thông tin Linux. (2007). Truy cập ngày 29 tháng 4 năm 2015, từ Linfo.org:http://www.linfo.org/Cooper, M. (n.d.). Hướng dẫn viết tập lệnh Bash nâng cao. Truy cập ngày 29 tháng 4 năm 2015, từhttp://www.tldp.org/LDP/abs/html/
Biến môi trường. (n.d.). Truy cập ngày 29 tháng 4 năm 2015, từ Tài liệu Ubuntu:https://help.ubuntu.com/community/EnvironmentVariables