Cách sử dụng lệnh read trong Linux

Đô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ụ.

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ọnMô 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.
-sChạy âm thầm, nghĩa là dữ liệu đầu vào không được hiển thị trên terminal
-eCho 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
-rKhi đượ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>
Sử dụng lệnh read để thu thập đầu vào từ người dùng
Sử dụng lệnh read để thu thập đầu vào từ người dùng

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
Sử dụng lệnh echo để hiển thị đầu ra của biến REPLY
Sử dụng lệnh echo để hiển thị đầu ra của biến 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>
Đọc giá trị đầu vào của người dùng và lưu trữ vào biến 
Đọc giá trị đầu vào của người dùng và lưu trữ vào biến

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
Hiển thị giá trị đã thu thập của biến bằng lệnh echo
Hiển thị giá trị đã thu thập của biến bằng lệnh echo

Đọ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>
Đọc nhiều giá trị và lưu trữ chúng vào nhiều biến
Đọc nhiều giá trị và lưu trữ chúng vào nhiều biến

Ở đâ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>
Hiển thị nhiều giá trị bằng lệnh echo
Hiển thị nhiều giá trị bằng lệnh echo

Đọ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
Đọc từ file bằng lệnh read
Đọc từ file bằng lệnh read

Ở đâ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
Đọc giá trị đầu vào từ người dùng trong loop liên tục
Đọc giá trị đầu vào từ người dùng trong loop liên tục

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
Tạo lời nhắc trước khi đọc dữ liệu đầu vào từ người dùng
Tạo lời nhắc trước khi đọc dữ liệu đầu vào từ người dùng

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
Đọc đầu vào dựa trên giá trị ký tự đã chỉ định
Đọc đầu vào dựa trên giá trị ký tự đã chỉ định

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"
Đọc lệnh với dấu phân cách Ifs
Đọc lệnh với dấu phân cách Ifs

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!"
Đọc giá trị đầu vào trong thời gian đã cho
Đọc giá trị đầu vào trong thời gian đã cho

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>
Sử dụng tùy chọn -s với lệnh read để ẩn thông tin
Sử dụng tùy chọn -s với lệnh read để ẩn thông tin

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"
Hiển thị mật khẩu đã chụp bằng tùy chọn -e và lệnh echo
Hiển thị mật khẩu đã chụp bằng tùy chọn -e và lệnh echo

Ở đâ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.

Thứ Năm, 21/11/2024 17:38
52 👨 206
0 Bình luận
Sắp xếp theo
    ❖ Linux