Đôi khi khi tương tác với hệ thống Linux, bạn có thể cần nhắc người dùng nhập dữ liệu hoặc đọc dữ liệu từ các file hoặc thậm chí muốn đặt thời gian chờ. Bạn có thể thực hiện các tác vụ này và nhiều tác vụ khác bằng lệnh read và các tùy chọn khác nhau của lệnh này.
Bài viết này sẽ hướng dẫn bạn những điều cơ bản về lệnh read và các tùy chọn của lệnh này thông qua một số ví dụ.
Mục lục bài viết
Lệnh Read là gì?
Trong Linux, bạn có thể sử dụng lệnh read để ghi lại dữ liệu đầu vào của người dùng hoặc đọc một dòng từ đầu vào chuẩn (stdin). Lệnh này đọc tổng số byte từ mô tả file đã cho và lưu trữ chúng trong buffer. Sau đó, lệnh trả về số byte đã đọc, số không hoặc lỗi.
Ví dụ, nếu số hoặc số đếm bằng không, lệnh sẽ tham chiếu đến phần cuối của file. Nhưng khi thành công, lệnh sẽ trả về số byte đã đọc. Nếu lệnh read tìm thấy một số lỗi, lệnh sẽ trả về -1.
Trước khi khám phá các tùy chọn lệnh read, trước tiên chúng ta hãy xem cú pháp của lệnh read:
read [options] [name…]
Ở đây, tham số options chỉ định nhiều flag khác nhau được sử dụng để sửa đổi hành vi của lệnh read. Ngoài ra, tham số name chỉ định tên của nhiều biến được sử dụng để lưu trữ dữ liệu đầu vào. Nếu không cung cấp tên, dữ liệu đầu vào sẽ được giữ lại trong biến bash $REPLY.
Các tùy chọn lệnh read
Lệnh read của Bash có nhiều tùy chọn để kiểm soát dữ liệu đầu vào của người dùng. Một số tùy chọn không cần tham số bổ sung, trong khi một số khác thì cần.
Hãy cùng khám phá một số tùy chọn mà chúng ta có thể sử dụng với lệnh read:
Tùy chọn | Mô tả |
---|---|
-a <array> | Nó lưu trữ dữ liệu đầu vào dưới dạng một mảng thay vì các biến riêng biệt. |
-s | Chạy âm thầm, nghĩa là dữ liệu đầu vào không được hiển thị trên terminal |
-e | Cho phép hỗ trợ thư viện readline và đọc dòng input |
-i <prefix> | Cung cấp giá trị đầu vào ban đầu xuất hiện tại dấu nhắc khi sử dụng readline |
-p <prompt> | Hiển thị lời nhắc được chỉ định trước khi đọc đầu vào |
-u <file descriptor> | Đọc từ một mô tả file được chỉ định thay vì đầu vào chuẩn (stdin) |
-d <delimiter> | Cho phép chỉ định một dấu phân cách dòng đầu vào thay vì ký tự xuống dòng mặc định |
-t <time> | Đặt thời gian chờ cho đầu vào; nếu đầu vào không được nhận trong thời gian này, lệnh read sẽ trả về lỗi |
-r | Khi được thiết lập, dấu gạch chéo ngược không được coi là ký tự thoát |
-n <number> | Chỉ đọc số lượng ký tự được chỉ định |
Nhập lệnh sau để xuất menu trợ giúp lệnh read:
head --help
Cách đọc đầu vào bằng lệnh read
Cách đơn giản nhất để sử dụng lệnh read là sử dụng lệnh này mà không có bất kỳ đối số hoặc tùy chọn nào. Khi chỉ thực thi lệnh read, lệnh sẽ yêu cầu bạn cung cấp đầu vào mà bạn muốn đọc. Sau khi cung cấp đầu vào, lệnh sẽ thoát và lưu trữ đầu vào đó trong biến mặc định có tên là REPLY.
Hãy lấy ví dụ sau:
read
<user_input>
Bây giờ, sau khi cung cấp đầu vào, hãy hiển thị đầu vào đó bằng lệnh echo:
echo $REPLY
Trong khi đọc giá trị đầu vào, bạn cũng có thể lưu trữ nó trong bất kỳ biến cụ thể nào khác. Ví dụ, để lưu trữ kết quả vào một biến, hãy nhập lệnh read theo sau là tên biến:
read variable1
<user_input>
Bây giờ, để hiển thị kết quả, bạn cần sử dụng lệnh echo với biến lưu trữ giá trị:
echo $variable1
Đọc nhiều giá trị
Không có cách trực tiếp nào để đọc nhiều giá trị bằng lệnh read. Tuy nhiên, bạn có thể chia một câu đầu vào thành nhiều từ và lưu trữ chúng trong các biến khác nhau.
Hãy xem xét ví dụ sau:
read variable1 variable2 variable3
<user_input>
Ở đây, bạn lưu trữ từ đầu tiên của câu trong biến đầu tiên, từ thứ hai trong biến thứ hai và tất cả các từ còn lại trong biến cuối cùng được cung cấp.
Hãy trả về đầu ra bằng lệnh sau:
echo <$variabl_namee>
Đọc từ một file
Mặc dù lệnh read chủ yếu dành cho đầu vào của người dùng, bạn cũng có thể sử dụng lệnh này để đọc các dòng từ file. Để thực hiện việc này, chỉ cần sử dụng loop while, lệnh echo và lệnh read theo sau là tên biến cụ thể:
while read line; do
echo "$line"
done < samplefile.txt
Ở đây, loop while đọc từng dòng của "samplefile.txt" và ghi lại trong biến line. Sau khi đọc tất cả các dòng của file, lệnh echo sẽ hiển thị giá trị của dòng đó.
Đọc đầu vào trong loop
Bạn cũng có thể nắm bắt đầu vào của người dùng theo trình tự lặp lại bằng cách sử dụng lệnh read với loop while. Điều này hữu ích khi bạn muốn thu thập nhiều đầu vào hoặc tiếp tục cho đến khi đáp ứng được một điều kiện cụ thể.
Ví dụ, hãy đọc nhiều đầu vào và cũng hiển thị chúng trên terminal:
while read line; do
echo "Line: $line"
done
Hơn nữa, loop tiếp tục cho đến khi nhận được tín hiệu kết thúc file (EOF), thường là bằng cách nhấn Ctrl + D.
Cách nhắc nhập dữ liệu bằng lệnh Read
Bạn cũng có thể tạo lời nhắc tương tác sẽ hiển thị trước khi người dùng nhập dữ liệu. Bạn có thể thực hiện việc này bằng cách sử dụng tùy chọn -p cùng với lệnh read.
Hãy hiển thị lời nhắc tùy chỉnh và cũng ghi lại đầu vào:
read -p "Enter your Name: " name
Giới hạn đầu vào của người dùng trong khi đọc
Bạn muốn kiểm soát những gì người dùng có thể nhập? Sử dụng tùy chọn -n với lệnh read để chỉ định độ dài ký tự mong muốn của bạn. Ví dụ, nếu bạn muốn ghi lại 4 ký tự đầu tiên của đầu vào người dùng, hãy sử dụng lệnh bên dưới:
read -n 9 variable
Sau khi thực hiện lệnh trên, bạn chỉ có thể nhập 9 ký tự. Giới hạn đầu vào của người dùng trong khi đọc sẽ loại bỏ nhu cầu sử dụng dấu phân cách và cũng không chia đầu vào thành các từ.
Phân tách các trường đầu ra bằng IFS
Bạn có thể sử dụng biến Internal Field Separator (IFS) với lệnh read để xác định cách chia đầu vào thành các trường riêng biệt. Theo mặc định, IFS sử dụng các ký tự khoảng trắng (tab, xuống dòng và khoảng trắng) làm dấu phân cách trường. Tuy nhiên, bạn có thể tùy chỉnh IFS để phù hợp với nhu cầu của mình.
Ví dụ, bạn có thể chỉ định giá trị dấu hai chấm (:) làm dấu phân cách:
IFS=':' read name password
<user_input>
echo "Name: $name, Password: $password"
Với biến IFS, bạn có thể nắm bắt nhiều đầu vào dòng từ người dùng và phân tách chúng dựa trên giá trị dấu phân cách.
Thiết lập thời gian chờ khi đọc
Bạn cũng có thể cấu hình thời gian chờ cho lệnh read bằng tùy chọn -t. Điều này hữu ích nếu bạn muốn đảm bảo tập lệnh không phụ thuộc vào đầu vào của người dùng trong thời gian dài.
Hãy thiết lập thời gian chờ 10 giây bằng tùy chọn -t:
read -t 10 -p "Enter your name (10 seconds timeout): " name
<user_input>
echo "Hello, $name!"
Nếu người dùng không nhập bất kỳ thông tin gì trong vòng 10 giây, script sẽ tiếp tục thực thi.
Cách ẩn đầu vào của người dùng
Đôi khi, bạn có thể muốn ẩn đầu vào của người dùng, chẳng hạn như khi nhập thông tin nhạy cảm như mật khẩu. Bạn có thể thực hiện điều này bằng cách sử dụng tùy chọn -s của lệnh read:
read -s -p "Enter your password: " password
<user_input>
Sau khi lưu trữ mật khẩu trong biến đã chỉ định, bạn có thể hiển thị mật khẩu đó trong terminal bằng lệnh echo:
echo -e "\nPassword: $password"
Ở đây, flag -e cho phép diễn giải các chuỗi thoát và chuỗi thoát \n thêm một dòng mới trước đầu ra.
Khi bạn đọc xong bài viết này và làm theo các ví dụ, bạn sẽ quen với việc sử dụng lệnh read trong terminal Linux. Tuy nhiên, vẫn còn một số lệnh khác để khám phá. Hãy tiếp tục đọc để tìm hiểu các lệnh cơ bản dành cho người mới bắt đầu.