Shell Scripting Phần 2: Chấp nhận đầu vào và thực hiện phép tính Shell

theanh

Administrator
Nhân viên
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!

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ếnCách sử dụng
BASHLư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_VERSIONLưu giữ phiên bản phát hành bash của máy hiện đang sử dụng
HOMELưu giữ tương đối đường dẫn của thư mục gốc.
LOGNAMELưu trữ tên tài khoản của người dùng hiện đang đăng nhập
OSTYPELưu trữ chuỗi mô tả hệ điều hành hiện tại của máy được sử dụng
PATHLư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
PWDLưu trữ thư mục làm việc hiện tại của shell
SHELLLưu trữ shell dòng lệnh được ưu tiên
USERHoạ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
Để 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:
Mã:
#!/bin/bash
 echo $PWD
 echo $LOGNAME
 echo $OSTYPE
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.

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

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:
  1. Tên biến phải bắt đầu bằng một chữ cái hoặc dấu gạch dưới.
  2. Nó chỉ được chứa các ký tự chữ và số hoặc dấu gạch dưới.
  3. 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.
Để chứng minh quy tắc này, chúng ta sẽ tạo một tập lệnh đơn giản bên dưới:
Mã:
#!/bin/bash
 12abc=10
 abc#*=10
 _abc=10
 _ABC=2
 echo $12abc $abc#* $_abc $_ABC
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.


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
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.
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."
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à:
Mã:
read -p "Dấu nhắc của bạn: "
Để đơn giản hóa mã trước đó, chúng ta có thể xây dựng lại mã thành:
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"
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à:
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ápCách sử dụng
+Phép cộnga=$((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âna=$((b*c))Nhân giá trị của b với c và lưu vào biến a
/Phép chiaa=$((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
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:
Mã:
#!/bin/bash
 read -p "Enter int1: " a
 read -p "Enter int2: " b
 echo $((a+b))
 c=$a+$b
 echo $c
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.


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
 
Back
Bên trên