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
Ieșire
a.bLinie de comanda
aruncata b| a te alatura | a te alatura. |Ieșire
la|bFuncț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
aruncat {1..10} |harta pow
Ieșire
14
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 9Bucle 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.
Construilhs| in timp ce citit
do
Adevărat
Terminat
lhs este uncomandacare returnează o listă de linii
Comenzi
sec 5 | in timp ce cititeudo
aruncat $ {i}
Terminat
Ieșire
12
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.
Construiin timp ce citit
do
Adevărat
Terminat <rhs
rhs este unfişiercare conțin linii
Comenzi
sec 5 >rhsin 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 5Citirea 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.sh10Ieș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 -laMINGW64_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 -laLinux 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
ocolirearuncats-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.