Lệnh đọc bash

Bash Read Command



Đọc hoặc chết bạn bè. Lệnh read cũng quan trọng như tham số vị trí và lệnh echo. Bạn sẽ làm cách nào khác để bắt đầu vào của người dùng, chấp nhận mật khẩu, viết các hàm, vòng lặp và xem trước các bộ mô tả tệp? Đọc tiếp.

Những gì được đọc?

Read là một lệnh nội trang bash đọc nội dung của một dòng vào một biến. Nó cho phép tách từ được gắn với biến shell đặc biệt IFS. Nó chủ yếu được sử dụng để bắt đầu vào của người dùng nhưng có thể được sử dụng để triển khai các chức năng lấy đầu vào từ đầu vào chuẩn.







Trợ giúp lệnh nội trang đọc Bash

Trước khi chúng tôi đi sâu vào cách sử dụng lệnh đọc trong tập lệnh bash, đây là cách chúng tôi nhận trợ giúp. Ở đó, bạn sẽ thấy tất cả các tùy chọn có sẵn cho lệnh đọc cùng với các mô tả mà chúng tôi sẽ cố gắng trình bày trong các ví dụ.



Dòng lệnh



Cứu giúp đọc

Đầu ra





đọc:đọc [-ers] [-một mảng] [-d chia sẻ] [-i văn bản] [-n nchars] [-N nchars]
[-p nhắc nhở] [-t hết thời gian] [-u fd] [Tên ...]

Đọc một dòng từ đầu vào chuẩn vàtách ranó vào các lĩnh vực.

Đọc một dòng từ đầu vào chuẩn hoặc từtập tinbộ mô tả FD
nếu nhưNS-utùy chọn được cung cấp. Dòng làtách ravào các lĩnh vựcnhưvới từ
tách và từ đầu tiên được gán cho NAME đầu tiên, từ thứ hai
từ đến NAME thứ hai, v.v., với mọi từ còn sót lại được gán cho
NSCuối cùngTÊN. Chỉ các ký tự được tìm thấytrong $ IFSđược công nhậnnhưtừ
dấu phân cách.

Nếu không có NAME nào được cung cấp, dòngđọcđược lưu trữtrongbiến REPLY.

Tùy chọn:
-đếnmảng gán các từđọcđến các chỉ số tuần tự của mảng
biến ARRAY, bắt đầu từ 0
-NSphân địnhtiếp tục cho đến khiký tự đầu tiên của DELIM làđọc, hơn là
hơn dòng mới
-chúng tôi sử dụng Readline để lấy dòngtrongmột vỏ tương tác
-tôisử dụng văn bản TEXTnhưvăn bản đầu tiênĐường đọc
-nncharstrở lạisau khi đọc NCHARS ký tự thay vì chờ đợi
một dòng mới, nhưng tôn trọng một dấu phân cáchnếu nhưít hơn so với

NCHARS ký tự làđọctrước dấu phân cách
-Nncharstrở lạichỉ sau khi đọc chính xác NCHARS ký tự, trừ khi
EOF gặp phải hoặcđọc lầnra ngoài, bỏ qua bất kỳ
dấu phân cách
-Pnhắc xuất chuỗi PROMPT không có dòng mới ở cuối trước
cố gắngđọc
-NSlàmkhông cho phép dấu gạch chéo ngược thoát khỏi bất kỳ ký tự nào
-NSlàmkhông phảiquăng điđầu vào đến từ một thiết bị đầu cuối
-NShết giờthời gianra ngoài vàtrở lạithất bạinếu nhưđếnhoàn thànhdòng
đầu vào khôngđọctrong vòng TIMEOUT giây. Giá trị của
Biến TMOUT là thời gian chờ mặc định. TIMEOUT có thể là một
Số phân số. Nếu TIMEOUT là0,đọctrả lại
ngay lập tức, mà không cần cố gắngđọcbất kỳ dữ liệu nào, trả về
chỉ thành côngnếu nhưđầu vào có sẵn trên
tập tinbộ mô tả. Cáclối ratrạng thái lớn hơn128
nếu nhưthời gian chờ đã vượt quá
-ufdđọctừtập tinbộ mô tả FD thay vì đầu vào tiêu chuẩn

Trạng thái thoát:
Cáctrở lạimã bằng 0, trừ khi gặp phải phần cuối của tệp,đọc lầnngoài
(trong cái mà trường hợplớn hơn 128), một lỗi gán biến

Nắm bắt đầu vào của người dùng

Các tập lệnh bash tương tác không là gì nếu không bắt được đầu vào của người dùng. Nội trang đọc cung cấp các phương thức mà đầu vào của người dùng có thể bị bắt trong một tập lệnh bash.

Bắt một dòng đầu vào

Để bắt một dòng NAME đầu vào và các tùy chọn không bắt buộc phải đọc. Khi NAME không được chỉ định, một biến có tên REPLY được sử dụng để lưu trữ thông tin nhập của người dùng.



Lệnh

{
quăng đi -n 'Nhập một cái gì đó và nhấn enter:';
đọc;
quăng điBạn đã gõ$ {REPLY}
}

Đầu ra

Nhập một cái gì đó và nhấn enter: cái gì đó(dòng mới)
Bạn đã gõ một cái gì đó

Nắm bắt một từ đầu vào

Để bắt một từ đầu vào, tùy chọn -d là bắt buộc. Trong trường hợp một từ, chúng ta sẽ đặt -d thành một khoảng trắng, đọc là ‘-d‘. Đó là khi người dùng nhấn phím cách đọc sẽ tải REPLY với từ đó.

Lưu ý rằng khi tùy chọn -d được đặt, phím xóa lùi không hoạt động như mong đợi. Để xóa lùi, trong khi cố gắng bắt một từ nhập liệu, tùy chọn -e có thể được sử dụng, đọc -e ‘-d‘.

Lệnh

{
quăng đi -n 'Nhập một cái gì đó và nhấn dấu cách:';
đọc '-NS ';
quăng đi '';
quăng đi 'Bạn đã gõ$ {REPLY}'
}

Đầu ra

Nhập cái gì đó và nhấn dấu cách: cái gì đó(không gian)
Bạn đã gõ một cái gì đó

Người sử dụng nhanh chóng

Trong các tập lệnh bash tương tác, việc nhắc người dùng có thể yêu cầu một thông báo cho người dùng biết đầu vào được mong đợi. Chúng tôi luôn có thể thực hiện điều này bằng cách sử dụng bản dựng tiếng vọng. Tuy nhiên, hóa ra có một tùy chọn sử dụng đọc.

Nhắc người dùng một từ

Khi bắt một từ đầu vào, chúng tôi đã sử dụng tiếng vang để viết Nhập thứ gì đó và nhấn dấu cách: thành đầu ra tiêu chuẩn trước khi đọc ‘-d‘. Tùy chọn -p cho phép hiển thị thông báo trước khi đọc từ đầu vào chuẩn.

Lệnh

{
đọc -P 'Nhập một cái gì đó và nhấn dấu cách:' '-NS ';
quăng đi '';
quăng đi 'Bạn đã gõ$ {REPLY}'
}

Đầu ra

Nhập cái gì đó và nhấn dấu cách: cái gì đó(không gian)
Bạn đã gõ một cái gì đó

Nhắc người dùng về một bí mật

Khi bắt đầu vào của người dùng mà nó không hiển thị trong thiết bị đầu cuối, tùy chọn -s có ích. read -s -p cho phép bạn bắt và ẩn đầu vào của người dùng như sau.

Lệnh

{
đọc -NS -P 'Nhập một cái gì đó mà tôi hứa sẽ giữ bí mật:'
quăng đi '';
quăng đi 'Bí mật của bạn an toàn với tôi';không đặtĐÁP LẠI ;
quăng đi '$ {REPLY}'
}

Đầu ra

Nhập một cái gì đó mà tôi hứa sẽ giữ bí mật:
Bí mật của bạn an toàn với tôi

Các hàm sử dụng read

Dưới đây là ví dụ về các hàm trong bash sử dụng đầu vào đọc và tiêu chuẩn

Khái niệm cốt lõi

Các chức năng sử dụng đọc sử dụng đầu vào và tham số tiêu chuẩn đường ống. Đầu vào chính của quá trình, chẳng hạn như các dòng trong tệp được chuyển vào thông qua đầu vào tiêu chuẩn thông qua một đường ống. Các đầu vào khác nếu-bất kỳ và tùy chọn được chuyển vào dưới dạng tham số.

đọc -NS 1TÊN1 TÊN2 ...

đọclà mộtđược xây dựng trong chỉ huy

-t 1 ngăn tập lệnh bash chờ vô thời hạn cho một dòng được trả về thông qua đầu vào chuẩn. Nếu đầu vào tiêu chuẩn ban đầu trống, hàm trả về với mã thoát là 142 biểu thị rằng không có ngày nào được đọc trong khoảng thời gian chờ đã đặt

NAME1 NAME2 là tên biến

... nhiều tên biến có thể được liệt kê

Bây giờ các nền tảng đã được thiết lập, hãy xem các chức năng quen thuộc trông giống như được triển khai bằng cách sử dụng read.

Tham gia chức năng bằng cách sử dụng đọc

Giả sử chúng ta muốn một hàm nối nhận một danh sách các từ và trả về một danh sách các từ khác được nối bằng dấu phân cách. Đây là cách chúng tôi có thể triển khai một hàm kết hợp bằng cách sử dụng read.

Kịch bản

#! / bin / bash
## tham gia
## phiên bản 0.0.2 - sửa các thông số đệ quy
##################################################### #
tham gia() { { địa phươngngười giới hạn;người giới hạn='$ {1-}';địa phươngngười vượt mặt;
người vượt mặt='$ {2-.}';}
địa phươngxe ô tô
địa phươngcdr
địa phươngIFS
IFS='$ {indelimiter}'
đọc -NS 1xe cdr|| trở lại
kiểm tra '$ {cdr}' || { quăng đi '$ {ô tô}';trở lại;}
quăng đi '$ {ô tô}$ {ranh giới}$ {cdr}' | $ {FUNCNAME} '$ {indelimiter}'
'$ {ranh giới}'
}
##################################################### #
## được tạo bởi create-stub2.sh v0.1.2
## vào Thứ Hai, ngày 17 tháng 6 năm 2019 12:24:59 +0900
## Thấy chưa
##################################################### #

Nguồn: tham gia.sh
Dòng lệnh

quăng đia b| tham gia

Đầu ra

a.b

Dòng lệnh

quăng đia b| tham gia | tham gia. |

Đầu ra

đến|NS

Lập bản đồ các chức năng bằng cách sử dụng read

Giả sử chúng ta muốn một hàm ánh xạ nhận một danh sách và trả về một danh sách khác chứa cùng một số phần tử được sửa đổi bởi một hàm khác. Đây là cách chúng tôi có thể triển khai một chức năng bản đồ bằng cách sử dụng read.

Kịch bản

#! / bin / bash
## bản đồ
## phiên bản 0.0.1 - ban đầu
##################################################### #
bản đồ() { { địa phươngTên chức năng ;Tên chức năng='$ {1}';}
địa phươngxe ô tô
địa phươngcdr
địa phươngIFS
IFS='$ {indelimiter-}'
đọc -NS 1xe cdr|| trở lại
kiểm tra '$ (khai báo -f $ {function_name})' || trở lại
kiểm tra '$ {ô tô}' || { thật;trở lại;}
$ {function_name} $ {ô tô}
quăng đi '$ {cdr}' | $ {FUNCNAME} '$ {function_name}'
}
##################################################### #
## được tạo bởi create-stub2.sh v0.1.2
## vào Thứ Ba, ngày 18 tháng 6 năm 2019 08:33:49 +0900
## Thấy chưa
##################################################### #

Nguồn: map.sh
Lệnh

NS() { địa phương -tôi tôi=$ {1};quăng đi$((tôi** 2 ));}
quăng đi {1..10} |bản đồ pow

Đầu ra

1
4
9
16
25
36
49
64
81
100

Chức năng lọc bằng cách sử dụng đọc

Giả sử chúng ta muốn một hàm bộ lọc nhận một danh sách và trả về một danh sách con gồm các điều kiện thỏa mãn các phần tử được đặt bởi một hàm khác. Đây là cách chúng tôi có thể triển khai một chức năng bộ lọc bằng cách sử dụng read.

Kịch bản

#! / bin / bash
## lọc
## phiên bản 0.0.1 - ban đầu
##################################################### #
lọc() { { địa phươngTên chức năng ;Tên chức năng='$ {1}';}
địa phươngxe ô tô
địa phươngcdr
địa phươngIFS
IFS='$ {indelimiter-}'
đọc -NS 1xe cdr|| trở lại
kiểm tra '$ (khai báo -f $ {function_name})' || trở lại
kiểm tra '$ {ô tô}' || { thật;trở lại;}
$ {function_name} '$ {ô tô}' || quăng đi -n '$ {ô tô}'
quăng đi '$ {cdr}' | $ {FUNCNAME} '$ {function_name}'
}
##################################################### #
## được tạo bởi create-stub2.sh v0.1.2
## vào Thứ Ba, ngày 18 tháng 6 năm 2019 13:19:54 +0900
## Thấy chưa
##################################################### #

Nguồn: filter.sh

Lệnh

số lẻ() { địa phương -tôi tôi=$ {1};kiểm tra !$((tôi% 2 )) -eq 1;}
quăng đi {1..10} |lọc lẻ

Đầu ra

1 3 5 7 9

Các vòng lặp bằng cách đọc

Các vòng lặp sử dụng read cho phép bạn lặp qua các dòng của một tệp sẽ được tạo hoặc đã tồn tại.

Vòng lặp khi đọc cơ bản cho phía bên trái (lhs)

Chúng ta có một lệnh hoặc hàm (lhs) có thể tạo ra các dòng trong một tệp có thể được lặp lại thông qua việc sử dụng vòng lặp read và while.

Xây dựng

lhs| trong khi đọc
làm
thật
xong
lhs là mộtchỉ huytrả về một danh sách các dòng

Lệnh

seq 5 | trong khi đọctôi
làm
quăng đi $ {i}
xong

Đầu ra

1
2
3
4
5

Vòng lặp trong khi đọc cơ bản cho phía bên tay phải (rhs)

Chúng tôi có một tệp (rhs) với các dòng có thể được lặp lại bằng cách sử dụng vòng lặp read và while.

Xây dựng

trong khi đọc
làm
thật
xong <rhs

rhs là mộttập tinchứa các dòng

Lệnh

seq 5 >rhs
trong khi đọctôi
làm
quăng đi $ {i}
xong <rhs

Đầu ra

1
2
3
4
5

Lhs tùy chỉnh trong khi vòng lặp sử dụng đọc

Chúng tôi có một loạt các từ mà chúng tôi muốn lặp lại bằng cách sử dụng read.

Xây dựng

(
IFS=''
lhs| trong khi đọc
làm
thật
xong
)

lhs là một danh sách các từ

Lệnh

(
IFS=''
quăng đi {1..5} | trong khi đọctôi
làm
quăng đi '$ {i}
xong
)

Đầu ra

1 2 3 4 5

Đọc từ bất kỳ fd nào thay vì đầu vào tiêu chuẩn

Tùy chọn nội trang đọc thường được để nguyên là tùy chọn cho phép bạn xác định cụ thể bộ mô tả tệp cần đọc, đọc -u FD. Theo mặc định, FD được coi là đầu vào tiêu chuẩn.

Khái niệm cốt lõi

Khi một tệp đã mở, bộ mô tả tệp được chỉ định. Chuyển hướng IO trong bash cho phép một tệp được để mở với một bộ mô tả tệp cụ thể. Chúng tôi được phép ghi vào tệp, đọc từ tệp và đóng tệp khi chúng tôi hoàn tất.

_()
{
con mèo /nhà phát triển/vô giá trị>myfifo;# trống myfifo
người thực thi 3<myfifo;# mở tệp myfifo dưới dạng fd 3
quăng đi 'Chào thế giới! - từ fd 3 ' >myfifo;# ghi vào myfifo
đọc -u 3;# đọc dòng từ fd 3
người thực thi 3> &-;# đóng fd 3
quăng đi $ {REPLY} # dòng đầu ra được đọc từ fd 3 trước khi đóng
}
_# Chào thế giới! từ fd 3

Xây dựng một đoàn tàu với bộ mô tả tệp và đọc -u FD

Chỉ để cho vui, tôi quyết định xây dựng một chuyến tàu với bộ mô tả tệp và đọc -u FD. Đối với mỗi bộ mô tả tệp, một số được ghi. Mỗi bộ mô tả tệp đọc từ bộ mô tả tệp 1 bên dưới và gắn vào chính nó.

Dòng lệnh

bấu víulinuxhint.com/xây dựng/tàu test-read-fd.sh10

Đầu ra

khởi tạo fds ...
khởi tạo fd3...
fd3phức tạp hóa
khởi tạo fd4...
fd4phức tạp hóa
fds intialized
đọc từ fd34...
4 3
fds trước khi dọn dẹp
0 1 2 3 4 5
dọn dẹp ...
dọn dẹp fds ...
xongdọn dẹp fds
fds sau khi dọn dẹp
0 1 2 3

Bỏ qua chức năng sử dụng read -u FD

Nếu bạn đang chạy

uname -đến
MINGW64_NT-10.0DESKTOP-XVVVVVV 2.7.0(0,307/5/3)
2017-02-17 14:hai mươix86_64 Msys
bấu víu --phiên bản
GNUbấu víu, phiên bản 4.4.12(1)-phóng thích(x86_64-pc-msys)

có thể do lỗi triển khai hàm bỏ qua bỏ qua dòng sau trong tập lệnh bash bên ngoài các hàm trước khi nguồn tập lệnh được đọc. Lưu ý rằng nó không hoạt động trên hầu hết các hệ thống. Ví dụ,

uname -đến
Linux 4.9.0-số 8-amd64# 1 Debian SMP 4.9.144-3.1 (2019-02-19) x86_64 GNU / Linux
bấu víu --phiên bản
GNUbấu víu, phiên bản 4.4.12(1)-phóng thích(x86_64-pc-linux-gnu)

bỏ qua không bay.

Hàm số

nhảy() { đọc -u 31;}

Lệnh

nhảy
quăng đidòng bị bỏ qua
thật

Đầu ra

(trống)

Điểm mấu chốt

Nội trang đọc trong bash không chỉ là bắt đầu vào của người dùng. Nó có thể được sử dụng trong các chức năng, vòng lặp và trao đổi giữa các bộ mô tả tệp được sử dụng trong các tập lệnh bash. Đôi khi, việc khám phá bằng cách sử dụng trình mô tả tệp và đọc có thể mang lại những quả trứng Phục sinh.