Comanda Bash read

Bash Read Command



Citiți sau muriți prieteni. Comanda de citire este la fel de importantă ca parametrii de poziție și comanda de ecou. Cum altfel veți captura datele introduse de utilizator, veți accepta parolele, veți scrie funcții, o buclă și veți arunca o privire în descriptorii de fișiere? Citiți mai departe.

Ce se citește?

Citiți este o comandă bash încorporată care citește conținutul unei linii într-o variabilă. Permite împărțirea cuvintelor care este legată de variabila shell specială IFS. Este utilizat în principal pentru captarea intrărilor utilizatorului, dar poate fi utilizat pentru a implementa funcții care preluează intrarea din intrarea standard.







Bash citește ajutorul pentru comanda integrată

Înainte de a ne arunca cu capul în modul de utilizare a comenzii read în scripturile bash, iată cum primim ajutor. Acolo ar trebui să vedeți toate opțiunile disponibile pentru comanda de citire împreună cu descrieri pe care vom încerca să le acoperim în exemple.



Linie de comanda



Ajutor citit

Ieșire





citit:citit [-ers] [-o matrice] [-d share] [-i text] [-n nchars] [-N nchars]
[-p prompt] [-t timeout] [-u fd] [Nume ...]

Citiți o linie din intrarea standard șiDespicăîn câmpuri.

Citește o singură linie din intrarea standard sau dinfişierdescriptor FD
dacăthe-uopțiunea este furnizată. Linia esteDespicăîn câmpurila fel decu cuvânt
divizarea, iar primul cuvânt este atribuit primului NUME, al doilea
cuvânt la al doilea NUME și așa mai departe, cu orice cuvinte rămase atribuite
theultimulNUME. Doar personajele găsiteîn $ IFSsunt recunoscutela fel decuvânt
delimitatori.

Dacă nu sunt furnizate NAME, liniacititeste depozitatînvariabila RĂSPUNS.

Opțiuni:
-lamatrice atribuie cuvintelecititla indicii secvențiali ai matricei
variabilă ARRAY, începând de la zero
-ddelimcontinua pana candprimul personaj al DELIM estecitit, mai degraba
decât newline
-se folosește Readline pentru a obține liniaînun shell interactiv
-iutilizarea textului TEXTla fel detextul inițialpentruCiteste linia
-nncharsîntoarceredupă ce ați citit mai degrabă caractere NCHARS decât așteptat
pentruo linie nouă, dar onorează un delimitatordacămai puțin de

Caracterele NCHARS suntcititînaintea delimitatorului
-Nncharsîntoarcerenumai după citirea exactă a caracterelor NCHARS, cu excepția cazului în care
EOF este întâlnit saucitit oriafară, ignorând orice
delimitator
-ppromptul de ieșire șirul PROMPT fără o linie nouă finală înainte
încercând săcitit
-rdonu permiteți ca backslash-urile să scape de niciun caracter
-sdonuaruncatintrare provenind de la un terminal
-tpauzătimpafară șiîntoarcereeșecdacălacompletlinia de
intrarea nu estecititîn TIMEOUT secunde. Valoarea
Variabila TMOUT este expirarea implicită. TIMEOUT poate fi un
număr fracțional. Dacă TIMEOUT este0,cititse intoarce
imediat, fără să încerccititorice date, revenind
numai succesdacăde intrare este disponibil pe specificat
fişierdescriptor. TheIeșirestatutul este mai mare decât128
dacătimpul de expirare este depășit
-ufdcititdinfişierdescriptorul FD în locul intrării standard

Stare ieșire:
Theîntoarcerecodul este zero, cu excepția cazului în care se întâlnește sfârșitul fișierului,citit oriafară
(în care cazaceastaeste mai mare de 128), o eroare de atribuire variabilă

Captarea intrărilor utilizatorului

Scripturile interactive bash nu sunt nimic fără a prinde datele introduse de utilizator. Încorporarea citită oferă metode prin care intrarea utilizatorului poate fi capturată într-un script bash.

Prinderea unei linii de intrare

Pentru a prinde o linie de intrare NAME și opțiuni nu sunt necesare pentru citire. Când NAME nu este specificat, o variabilă numită REPLY este utilizată pentru a stoca datele introduse de utilizator.



Comenzi

{
aruncat -n 'Tastați ceva și apăsați Enter:';
citit;
aruncatAi tastat$ {REPLY}
}

Ieșire

Tastați ceva și apăsați Enter: ceva(linie nouă)
Ai tastat ceva

Prinderea unui cuvânt de intrare

Pentru a prinde un cuvânt de intrare, este necesară opțiunea -d. În cazul unui cuvânt, setăm -d pe un spațiu, citim „-d”. Atunci utilizatorul apasă pe bara de spațiu citită va încărca RĂSPUNS cu cuvântul.

Rețineți că, atunci când opțiunea -d este setată, backspace-ul nu funcționează conform așteptărilor. Pentru a derula înapoi, în timp ce încercați să prindeți un cuvânt de intrare, poate fi utilizată opțiunea -e, citiți -e ‘-d’.

Comenzi

{
aruncat -n „Tastați ceva și atingeți spațiul:”;
citit „-d”;
aruncat '';
aruncat - Ai tastat$ {REPLY}'
}

Ieșire

Tastați ceva și loviți spațiul: ceva(spaţiu)
Ai tastat ceva

Utilizator prompt

În scripturile bash interactive care solicită utilizatorului să solicite un mesaj pentru a-i spune utilizatorului ce intrare este de așteptat. Putem realiza întotdeauna acest lucru folosind ecoul încorporat. Cu toate acestea, se pare că există o opțiune folosind citire.

Solicitați utilizatorului un cuvânt

Pentru a prinde un cuvânt de intrare, am folosit ecou pentru a scrie ceva și a lovi spațiul: la ieșirea standard înainte de a citi „-d”. Opțiunea -p permite afișarea unui mesaj înainte de a citi din intrarea standard.

Comenzi

{
citit -p „Tastați ceva și atingeți spațiul:” „-d”;
aruncat '';
aruncat - Ai tastat$ {REPLY}'
}

Ieșire

Tastați ceva și loviți spațiul: ceva(spaţiu)
Ai tastat ceva

Solicitați utilizatorului un secret

Când capturați datele de intrare ale utilizatorului fără ca acesta să apară în terminal, opțiunea -s este utilă. read -s -p vă permite să prindeți și să ascundeți datele introduse de utilizator după cum urmează.

Comenzi

{
citit -s -p „Tastați ceva ce promit să păstrez secretul:”
aruncat '';
aruncat „Secretul tău este în siguranță cu mine”;dezactivatRĂSPUNS;
aruncat '$ {REPLY}'
}

Ieșire

Tastați ceva ce promit să păstrez secretul:
Secretul tău este în siguranță cu mine

Funcții cu citire

Iată exemple de funcții în bash care utilizează citire și intrare standard

Concept de bază

Funcțiile care utilizează citire utilizează parametrii și intrarea standard canalizată. Intrarea principală care trebuie procesată, cum ar fi liniile dintr-un fișier, sunt transmise prin intrarea standard printr-o conductă. Alte intrări dacă-orice și opțiune sunt transmise ca parametri.

citit -t 1NAME1 NAME2 ...

cititeste unincorporat comanda

-t 1 împiedică scriptul bash să aștepte la nesfârșit ca o linie să fie returnată prin intrare standard. Dacă intrarea standard este inițial goală, funcția revine cu un cod de ieșire de 142, ceea ce înseamnă că nu a fost citită nicio dată în perioada de expirare stabilită

NAME1 NAME2 sunt nume de variabile

... pot fi listate multe nume de variabile

Acum că sunt pregătite bazele, să vedem cum arată funcțiile familiare implementate folosind read.

Funcția de alăturare utilizând citire

Să presupunem că dorim o funcție de asociere care să ia o listă de cuvinte și să returneze o altă listă de cuvinte alăturate printr-un delimitator. Iată cum putem implementa o funcție de asociere folosind read.

Script

#! / bin / bash
## a te alatura
## versiunea 0.0.2 - remediați parametrii de recursivitate
######################################################
a te alatura() { { locallimitator;limitator='{1-} $';localoutdelimiter;
outdelimiter='$ {2-.}';}
localmașină
localcdr
localIFS
IFS='$ {indelimiter}'
citit -t 1auto cdr|| întoarcere
Test '$ {cdr}' || { aruncat '$ {car}';întoarcere;}
aruncat '$ {car}$ {outdelimiter}$ {cdr}' | $ {FUNCNAME} '$ {indelimiter}'
'$ {outdelimiter}'
}
######################################################
## generat de create-stub2.sh v0.1.2
## luni, 17 iunie 2019 12:24:59 +0900
## vedea
######################################################

Sursă: alătură-te.sh
Linie de comanda

aruncata b| a te alatura

Ieșire

a.b

Linie de comanda

aruncata b| a te alatura | a te alatura. |

Ieșire

la|b

Funcții de hartă folosind citire

Să presupunem că dorim o funcție de hartă care să ia o listă și să returneze o altă listă care conține același număr de elemente care sunt modificate de o altă funcție. Iată cum putem implementa o funcție de hartă folosind read.

Script

#! / bin / bash
## Hartă
## versiunea 0.0.1 - inițială
######################################################
Hartă() { { localnume_funcție;nume_funcție='{1} $';}
localmașină
localcdr
localIFS
IFS='$ {indelimiter-}'
citit -t 1auto cdr|| întoarcere
Test '$ (declarați -f $ {nume_funcție})' || întoarcere
Test '$ {car}' || { Adevărat;întoarcere;}
$ {function_name} $ {car}
aruncat '$ {cdr}' | $ {FUNCNAME} '$ {function_name}'
}
######################################################
## generat de create-stub2.sh v0.1.2
## marți, 18 iunie 2019 08:33:49 +0900
## vedea
######################################################

Sursă: map.sh
Comenzi

NS() { local -i eu={1} $;aruncat$((eu** 2 ));}
aruncat {1..10} |harta pow

Ieșire

1
4
9
16
25
36
49
64
81
100

Funcția de filtrare folosind citire

Să presupunem că dorim o funcție de filtrare care să ia o listă și să returneze o sublistă de elemente care să satisfacă condițiile stabilite de o altă funcție. Iată cum putem implementa o funcție de filtrare folosind read.

Script

#! / bin / bash
## filtru
## versiunea 0.0.1 - inițială
######################################################
filtru() { { localnume_funcție;nume_funcție='{1} $';}
localmașină
localcdr
localIFS
IFS='$ {indelimiter-}'
citit -t 1auto cdr|| întoarcere
Test '$ (declarați -f $ {nume_funcție})' || întoarcere
Test '$ {car}' || { Adevărat;întoarcere;}
$ {function_name} '$ {car}' || aruncat -n '$ {car}'
aruncat '$ {cdr}' | $ {FUNCNAME} '$ {function_name}'
}
######################################################
## generat de create-stub2.sh v0.1.2
## marți, 18 iunie 2019 13:19:54 +0900
## vedea
######################################################

Sursă: filtru.sh

Comenzi

ciudat() { local -i eu={1} $;Test !$((eu% 2 )) -eq 1;}
aruncat {1..10} |filtru ciudat

Ieșire

1 3 5 7 9

Bucle folosind citire

Buclele care utilizează citire vă permit să parcurgeți liniile unui fișier care urmează să fie generat sau care există deja.

Buclă de bază în timp ce citiți pentru partea stângă (lhs)

Avem o comandă sau o funcție (lhs) care poate genera linii într-un fișier care poate fi buclat prin citire și buclă while.

Construi

lhs| in timp ce citit
do
Adevărat
Terminat
lhs este uncomandacare returnează o listă de linii

Comenzi

sec 5 | in timp ce cititeu
do
aruncat $ {i}
Terminat

Ieșire

1
2
3
4
5

Buclă de bază în timp ce citiți pentru partea dreaptă (rhs)

Avem un fișier (rhs) cu linii care pot fi buclate prin citire și buclă while.

Construi

in timp ce citit
do
Adevărat
Terminat <rhs

rhs este unfişiercare conțin linii

Comenzi

sec 5 >rhs
in timp ce cititeu
do
aruncat $ {i}
Terminat <rhs

Ieșire

1
2
3
4
5

Personalizat lhs în buclă folosind citire

Avem un flux de cuvinte pe care am vrea să le parcurgem prin citire.

Construi

(
IFS=''
lhs| in timp ce citit
do
Adevărat
Terminat
)

lhs este o listă de cuvinte

Comenzi

(
IFS=''
aruncat {1..5} | in timp ce cititeu
do
aruncat '$ {i}
Terminat
)

Ieșire

1 2 3 4 5

Citirea din orice fd în loc de intrare standard

Opțiunea integrată de citire lăsată adesea neatinsă este cea care vă permite să specificați din ce descriptor de fișier să citiți, citiți -u FD. În mod implicit, FD este considerat intrare standard.

Concept de bază

Atunci când un fișier deschis este descris descriptorii de fișiere. Redirecționarea IO în bash permite ca un fișier să fie lăsat deschis cu un descriptor de fișier specific. Ni se permite să scriem în fișier, să citim din acesta și să îl închidem când am terminat.

_()
{
pisică /dev/nul>myfifo;# myfifo gol
exec 3<myfifo;# deschideți fișierul myfifo ca fd 3
aruncat 'Salut Lume! - de la fd 3 ' >myfifo;# scrie la myfifo
citit -u 3;# citiți linia din fd 3
exec 3> &-;# închideți fd 3
aruncat $ {REPLY} # linia de ieșire citită din fd 3 înainte de închidere
}
_# Salut Lume! din fd 3

Construirea unui tren cu descriptori de fișiere și citire -u FD

Doar pentru distracție, am decis să construiesc un tren cu descriptori de fișiere și să citesc -u FD. Fiecare descriptor de fișier este scris cu un număr. Fiecare descriptor de fișier citește din descriptorul de fișiere 1 de mai jos și se atașează singur.

Linie de comanda

bashlinuxhint.com/construi/tren de testare-citire-fd.sh10

Ieșire

inițializare fds ...
inițializarea fd3...
fd3intializat
inițializarea fd4...
fd4intializat
fds intializat
citind din fd3și4...
4 3
fds înainte de curățare
0 1 2 3 4 5
a curăța ...
curățarea fds-urilor ...
Terminatcurățarea fds-urilor
fds după curățare
0 1 2 3

Funcția de saltare utilizând citirea -u FD

Dacă alergi

uname -la
MINGW64_NT-10.0DESKTOP-XVVVVVV 2.7.0(0,307/5/3)
2017.-02-17 14:douăzecix86_64 Msys
bash --versiune
GNUbash, versiunea 4.4.12(1)-eliberare(x86_64-pc-msys)

poate fi posibil din cauza unei erori să implementați o funcție skip care omite următoarea linie într-un script bash în afara funcțiilor înainte ca sursa scriptului să fie citită. Rețineți că nu funcționează pe majoritatea sistemelor. De exemplu,

uname -la
Linux 4.9.0-8-amd64# 1 Debian SMP 4.9.144-3.1 (2019-02-19) x86_64 GNU / Linux
bash --versiune
GNUbash, versiunea 4.4.12(1)-eliberare(x86_64-pc-linux-gnu)

skip nu zboară.

Funcţie

ocolire() { citit -u 31;}

Comenzi

ocolire
aruncats-a sărit linia
Adevărat

Ieșire

(gol)

Linia de fund

Citirea încorporată în bash face mai mult decât captează datele introduse de utilizator. Poate fi folosit în funcții, bucle și schimburi între descriptorii de fișiere utilizați în scripturile bash. Uneori, explorarea folosind descriptori de citire și fișiere poate produce ouă de Paște.