Bash naredba za čitanje

Bash Read Command

Čitajte ili umrite prijatelji. Naredba read jednako je važna kao i pozicijski parametri i naredba echo. Kako ćete inače hvatati korisničke unose, prihvaćati lozinke, pisati funkcije, petljati i zavirivati ​​u deskriptore datoteka? Nastavi čitati.

Što se čita?

Čitanje je bash ugrađena naredba koja čita sadržaj retka u varijablu. Omogućuje razdvajanje riječi koje je vezano za posebnu varijablu ljuske IFS. Prvenstveno se koristi za hvatanje korisničkog unosa, ali se može koristiti i za implementaciju funkcija uzimajući ulaz sa standardnog unosa.



Bash pročitajte pomoć za ugrađenu naredbu

Prije nego što uđemo u to kako koristiti naredbu read u bash skriptama, evo kako ćemo dobiti pomoć. Tamo biste trebali vidjeti sve dostupne opcije za naredbu za čitanje zajedno s opisima koje ćemo pokušati pokriti u primjerima.



Naredbeni redak



Pomozite čitati

Izlaz

čitati:čitati [-ers] [-niz] [-d delim] [-i tekst] [-n nchars] [-N nchars]
[-p upit] [-t timeout] [-u fd] [Ime ...]

Pročitajte redak sa standardnog ulaza ipodjelato u polja.

Čita jedan redak sa standardnog ulaza ili izdatotekadeskriptor FD
akothe-uopcija je isporučena. Linija jepodjelau poljakaos riječju
cijepanje, a prva riječ dodijeljena je prvom IME, druga
riječ drugom NAME, i tako dalje, sa svim preostalim riječima dodijeljenim
theposljednjiIME. Pronađeni su samo likoviu $ IFSsu prepoznatikaoriječ
graničnici.

Ako nisu navedena imena NAME, linijačitatise pohranjujeuvarijabla REPLY.

Opcije:
-doniz dodijeliti riječičitatina sekvencijalne indekse niza
varijabla ARRAY, počinje od nule
-ddelimnastaviti doprvi znak DELIMA ječitati, radije
nego novi redak
-e koristite Readline za dobivanje linijeuinteraktivna ljuska
-itekst koristiti TEXTkaopočetni tekstzaLinija za čitanje
-nncharspovrataknakon čitanja NCHARS znakova, a ne čekanja
zanovi redak, ali čast razdjelnikaakomanje od

NCHARS znakovi sučitatiprije razdjelnika
-Nncharspovrataktek nakon čitanja točno NCHARS znakova, osim ako
EOF se susreće iličitati putavan, ignorirajući bilo koji
razdjelnik
-strprompt ispišite niz PROMPT bez prethodnog novog retka
pokušavajućičitati
-rčinine dopustiti da obrnute kose crte izbjegnu bilo koji znak
-sčinineizbacitiulaz koji dolazi s terminala
-tpauzavrijemevan ipovratakneuspjehakodopotpunalinija od
ulaz niječitatiunutar TIMEOUT s. Vrijednost
Varijabla TMOUT zadano je vremensko ograničenje. TIMEOUT može biti a
razlomljeni broj. Ako je TIMEOUT0,čitativraća
odmah, bez pokušajačitatibilo koji podatak, vraća se
samo uspjehakoulaz je dostupan na navedenom
datotekadeskriptor. TheIzlazstatus veći od128
akovremensko ograničenje je premašeno
-uF Dčitatiizdatotekadeskriptor FD umjesto standardnog ulaza

Izlazni status:
Thepovratakkôd je nula, osim ako se naiđe na kraj datoteke,čitati putavan
(u koji slučajtoje veći od 128), greška u dodjeli varijable

Hvatanje unosa korisnika

Interaktivne bash skripte su ništa bez hvatanja korisničkog unosa. Ugrađeno čitanje pruža metode kojima se korisnički unos može uhvatiti unutar bash skripte.

Hvatanje linije unosa

Da biste uhvatili redak unosa, nazivi i opcije čitanjem nisu potrebni. Kada NAME nije navedeno, varijabla pod nazivom REPLY koristi se za spremanje unosa korisnika.



Naredbe

{
izbaciti -n 'Upišite nešto i pritisnite enter:';
čitati;
izbacitiVi ste upisali$ {REPLY}
}

Izlaz

Upišite nešto i pritisnite enter: nešto(nova linija)
Upisali ste nešto

Hvatanje riječi unosa

Da biste uhvatili riječ unosa, potrebna je opcija -d. U slučaju riječi bismo postavili -d na razmak, čitajući '-d'. Tada korisnik pritisne razmaknicu za čitanje učitat će REPLY s riječju.

Imajte na umu da kada je postavljena opcija -d, backspace ne radi kako se očekivalo. Za povratak, dok pokušavate uloviti riječ unosa, može se koristiti opcija -e, čitati -e '-d'.

Naredbe

{
izbaciti -n 'Upišite nešto i pritisnite razmak:';
čitati '-d';
izbaciti '';
izbaciti »Ti si upisao$ {REPLY}'
}

Izlaz

Upišite nešto i pritisnite razmaknicu: nešto(prostor)
Upisali ste nešto

Brz korisnik

U interaktivnim bash skriptama koje traže od korisnika može zahtijevati poruku koja će mu reći koji se ulaz očekuje. To uvijek možemo postići pomoću ugrađenog eha. Međutim, pokazalo se da postoji mogućnost korištenja read.

Zatražite od korisnika riječ

U hvatanju riječi unosa, koristili smo echo za upisivanje Upišite nešto i pritisnite razmak: na standardni izlaz prije čitanja '-d'. Opcija -p omogućuje prikaz poruke prije čitanja sa standardnog unosa.

Naredbe

{
čitati -str 'Upišite nešto i pritisnite razmak:' '-d';
izbaciti '';
izbaciti »Ti si upisao$ {REPLY}'
}

Izlaz

Upišite nešto i pritisnite razmaknicu: nešto(prostor)
Upisali ste nešto

Od korisnika zatražite tajnu

Kada uhvatite korisnički unos bez pojavljivanja na terminalu, opcija -s dobro dođe. read -s -p omogućuje hvatanje i skrivanje korisničkog unosa na sljedeći način.

Naredbe

{
čitati -s -str 'Upišite nešto što obećavam da ću držati u tajnosti:'
izbaciti '';
izbaciti 'Tvoja tajna je sa mnom sigurna';neraspoloženODGOVORI;
izbaciti '$ {REPLY}'
}

Izlaz

Upišite nešto što obećavam da će ostati tajna:
Tvoja tajna je sa mnom sigurna

Funkcije pomoću čitanja

Evo primjera funkcija u bashu koje koriste čitanje i standardni unos

Temeljni koncept

Funkcije koje koriste čitanje koriste standardne cijevne unose i parametre. Glavni ulaz koji treba obraditi, poput linija u datoteci, prolazi kroz standardni ulaz kroz cijev. Ostali unos ako postoji i opcija prosljeđuju se kao parametri.

čitati -t 1NAME1 NAME2 ...

čitatijeugrađen naredba

-t 1 sprječava bash skriptu da neograničeno čeka da se redak vrati kroz standardni unos. Ako je standardni ulaz u početku prazan, funkcija se vraća s izlaznim kodom 142 koji označava da nijedan datum nije pročitan unutar zadanog vremenskog ograničenja

NAME1 NAME2 su nazivi varijabli

... mogu se navesti mnogi nazivi varijabli

Sada kada su temelji postavljeni, pogledajmo kako izgledaju poznate funkcije implementirane pomoću read.

Pridružite se funkciji pomoću čitanja

Pretpostavimo da želimo funkciju pridruživanja koja uzima popis riječi i vraća drugi popis riječi spojenih razdjelnikom. Evo kako možemo implementirati funkciju pridruživanja pomoću čitanja.

Skripta

#!/bin/bash
## pridružiti
## verzija 0.0.2 - popravite parametre rekurzije
#################################################
pridružiti() { { lokalnograničnik;graničnik='{1} USD';lokalnoodvajač;
van graničnika='$ {2-.}';}
lokalnoautomobil
lokalnocdr
lokalnoIFS
IFS='$ {indelimiter}'
čitati -t 1auto cdr|| povratak
test '$ {cdr}' || { izbaciti '$ {car}';povratak;}
izbaciti '$ {car}$ {outdelimiter}$ {cdr}' | $ {FUNCNAME} '$ {indelimiter}'
'$ {outdelimiter}'
}
#################################################
## generira create-stub2.sh v0.1.2
## u ponedjeljak, 17. lipnja 2019. 12:24:59 +0900
## vidi
#################################################

Izvor: pridruži se.sh
Naredbeni redak

izbacitia b| pridružiti

Izlaz

a.b

Naredbeni redak

izbacitia b| pridružiti | pridružiti. |

Izlaz

do|b

Kartiranje funkcija pomoću čitanja

Pretpostavimo da želimo funkciju karte koja uzima popis i vraća drugi popis koji sadrži isti broj elemenata koje je promijenila druga funkcija. Evo kako možemo implementirati funkciju karte koristeći read.

Skripta

#!/bin/bash
## karta
## verzija 0.0.1 - početna
#################################################
karta() { { lokalnoime_funkcije;naziv_funkcije='{1} USD';}
lokalnoautomobil
lokalnocdr
lokalnoIFS
IFS='$ {indelimiter-}'
čitati -t 1auto cdr|| povratak
test '$ (deklarirajte -f $ {ime_funkcije})' || povratak
test '$ {car}' || { pravi;povratak;}
$ {ime_funkcije} $ {car}
izbaciti '$ {cdr}' | $ {FUNCNAME} '$ {ime_funkcije}'
}
#################################################
## generira create-stub2.sh v0.1.2
## u utorak, 18. lipnja 2019 08:33:49 +0900
## vidi
#################################################

Izvor: karta.sh
Naredbe

NS() { lokalno -i i={1} USD;izbaciti$((i** 2 ));}
izbaciti {1..10} |karta Pow

Izlaz

1
4
9
16
25
36
49
64
81
100

Funkcija filtriranja pomoću čitanja

Pretpostavimo da želimo funkciju filtriranja koja uzima popis i vraća podskup elemenata koji zadovoljavaju uvjete postavljene drugom funkcijom. Evo kako možemo implementirati funkciju filtra pomoću čitanja.

Skripta

#!/bin/bash
## filtar
## verzija 0.0.1 - početna
#################################################
filtar() { { lokalnoime_funkcije;naziv_funkcije='{1} USD';}
lokalnoautomobil
lokalnocdr
lokalnoIFS
IFS='$ {indelimiter-}'
čitati -t 1auto cdr|| povratak
test '$ (deklarirajte -f $ {ime_funkcije})' || povratak
test '$ {car}' || { pravi;povratak;}
$ {ime_funkcije} '$ {car}' || izbaciti -n '$ {car}'
izbaciti '$ {cdr}' | $ {FUNCNAME} '$ {ime_funkcije}'
}
#################################################
## generira create-stub2.sh v0.1.2
## u utorak, 18. lipnja 2019 13:19:54 +0900
## vidi
#################################################

Izvor: filter.sh

Naredbe

neparan() { lokalno -i i={1} USD;test !$((i% 2 )) -ekv 1;}
izbaciti {1..10} |filter neparan

Izlaz

1 3 5 7 9

Petlje pomoću čitanja

Petlje koje koriste čitanje omogućuju vam da prođete kroz retke datoteke koja se treba generirati ili već postoji.

Osnovna petlja čitanja za lijevu stranu (lhs)

Imamo naredbu ili funkciju (lhs) koja može generirati retke u datoteci koji se mogu petljati pomoću read i while petlje.

Konstruiraj

lhs| dok čitati
čini
pravi
učinjeno
lhs je anaredbakoji vraća popis redaka

Naredbe

slijedeće 5 | dok čitatii
čini
izbaciti $ {i}
učinjeno

Izlaz

1
2
3
4
5

Osnovna petlja čitanja za desnu stranu (rhs)

Imamo datoteku (rhs) s linijama koje se mogu provući pomoću čitanja i petlje while.

Konstruiraj

dok čitati
čini
pravi
učinjeno <rhs

rhs je adatotekakoji sadrže linije

Naredbe

slijedeće 5 >rhs
dok čitatii
čini
izbaciti $ {i}
učinjeno <rhs

Izlaz

1
2
3
4
5

Prilagođeni lhs while petlja pomoću čitanja

Imamo niz riječi koje bismo htjeli proći kroz čitanje.

Konstruiraj

(
IFS=''
lhs| dok čitati
čini
pravi
učinjeno
)

lhs je popis riječi

Naredbe

(
IFS=''
izbaciti {1..5} | dok čitatii
čini
izbaciti '$ {i}
učinjeno
)

Izlaz

1 2 3 4 5

Čitanje s bilo kojeg fd -a umjesto standardnog unosa

Ugrađena opcija čitanja koja često ostaje netaknuta je ona koja vam omogućuje da odredite iz kojeg opisnika datoteke čitate, -u FD za čitanje. Prema zadanim postavkama FD se uzima kao standardni ulaz.

Temeljni koncept

Prilikom otvaranja datoteke dodjeljuju se opisi datoteka. IO preusmjeravanje u bashu dopušta da se datoteka ostavi otvorena s određenim deskriptorom datoteke. Dopušteno nam je pisati u datoteku, čitati iz nje i zatvoriti je kad završimo.

_()
{
mačka /dev/null>myfifo;# prazan myfifo
exec 3<myfifo;# otvorena datoteka myfifo kao fd 3
izbaciti 'Pozdrav svijete! - od fd 3 ' >myfifo;# piši na myfifo
čitati -u 3;# pročitani redak s fd 3
exec 3> &-;# zatvori fd 3
izbaciti $ {REPLY} # izlazni redak očitan s fd 3 prije zatvaranja
}
_# Pozdrav svijete! s fd 3

Izgradnja vlaka s opisima datoteka i čitanjem -u FD

Iz zabave sam odlučio izgraditi vlak s opisima datoteka i čitati -u FD. Svakom deskriptoru datoteke upisuje se broj. Svaki deskriptor datoteke čita iz deskriptora datoteke 1 u nastavku i dodaje se u sebe.

Naredbeni redak

bashlinuxhint.com/izgraditi/test-read-fd.sh vlak10

Izlaz

inicijalizacija fds -a ...
inicijalizacija fd3...
F D3incijaliziran
inicijalizacija fd4...
F D4incijaliziran
fds incijaliziran
čitanje s fd -a3i4...
4 3
fds prije čišćenja
0 1 2 3 4 5
čišćenje ...
čišćenje fds -a ...
učinjenočišćenje fds
fds nakon čišćenja
0 1 2 3

Preskoči funkciju koristeći read -u FD

Ako trčite

uname -do
MINGW64_NT-10,0DESKTOP-XVVVVVV 2.7.0(0,307/5/3)
2017. godine.-02-17 14:dvadesetx86_64 gospođa
bash --verzija
GNUbash, verzija 4.4.12(1)-puštanje(x86_64-pc-msys)

zbog greške je moguće implementirati funkciju preskakanja koja preskače sljedeći redak u bash skripti izvan funkcija prije čitanja izvora skripte. Imajte na umu da ne radi na većini sustava. Na primjer,

uname -do
Linux 4.9.0-8-amd64#1 Debian SMP 4.9.144-3.1 (2019-02-19) x86_64 GNU/Linux
bash --verzija
GNUbash, verzija 4.4.12(1)-puštanje(x86_64-pc-linux-gnu)

skip ne leti.

Funkcija

preskočiti() { čitati -u 31;}

Naredbe

preskočiti
izbacitilinija preskočena
pravi

Izlaz

(prazan)

Poanta

Čitani ugrađeni bash ne samo da hvata korisnički unos. Može se koristiti u funkcijama, petljama i razmjeni između deskriptora datoteka koji se koriste u bash skriptama. Povremeno se istraživanjem pomoću opisa i čitanja datoteka mogu dobiti uskršnja jaja.