Bash ukaz za branje

Bash Read Command



Preberite ali umrite prijatelji. Ukaz za branje je prav tako pomemben kot pozicijski parametri in ukaz echo. Kako drugače boste ujeli uporabniški vnos, sprejeli gesla, zapisali funkcije, se zankali in pokukali v deskriptorje datotek? Beri naprej.

Kaj se bere?

Read je ukaz bash, ki bere vsebino vrstice v spremenljivko. Omogoča razdelitev besed, ki je vezana na posebno spremenljivko lupine IFS. Uporablja se predvsem za lovljenje uporabniškega vnosa, lahko pa se uporablja tudi za izvajanje funkcij, ki sprejemajo vnos iz standardnega vnosa.







Bash preberite pomoč za vgrajene ukaze

Preden se poglobimo v to, kako uporabiti ukaz za branje v skriptih bash, bomo dobili pomoč. Tam bi morali videti vse možnosti, ki so na voljo za ukaz za branje, skupaj z opisi, ki jih bomo poskušali zajeti v primerih.



Ukazna vrstica



pomoč prebrati

Izhod





preberi:prebrati [-ers] [-niz] [-d delnica] [-i besedilo] [-n nchars] [-N nchars]
[-p poziv] [-t timeout] [-u fd] [ime ...]

Preberite vrstico iz standardnega vnosa inrazcepljenoga na polja.

Prebere eno vrstico iz standardnega vhoda ali izmapadeskriptor FD
čethe-umožnost je priložena. Linija jerazcepljenov poljakotz besedo
razdelitev, prva beseda pa je dodeljena prvemu IME, druga
besedo drugemu imenu NAME in tako naprej z dodeljenimi preostalimi besedami
thezadnjiNAME. Najdeni so samo znakiv $ IFSso priznanikotbeseda
ločila.

Če imena NAME niso navedena, vrsticaprebratije shranjenavspremenljivko REPLY.

Opcije:
-zamatrika dodeli besedeprebratina zaporedne indekse matrike
spremenljivka NIZ, ki se začne pri nič
-ddelimnadaljuj doklerprvi znak DELIM jeprebrati, raje
kot nova vrstica
-e uporabite Readline za pridobitev vrsticevinteraktivna lupina
-jazbesedilo uporabite TEXTkotzačetno besedilozaReadline
-nncharsvrnitevpo branju znakov NCHARS in ne čakanju
zanova vrstica, vendar častite ločiločemanj kot

Znaki NCHARS soprebratipred ločilnikom
-Nncharsvrnitevšele po branju natančno znakov NCHARS, razen če
EOF naleti ozprebrati kratven, ne upoštevajoč nobenega
ločila
-strprompt izpiše niz PROMPT brez zadnje vrstice
poskušaprebrati
-rnaredine dovolite, da poševnice pobegnejo pred znaki
-snaredinevrgel venvhod, ki prihaja iz terminala
-todmorčasven invrnitevneuspehčedopopolnovrstica
vnos niprebrativ TIMEOUT sekundah. Vrednost
Spremenljivka TMOUT je privzeta časovna omejitev. TIMEOUT je lahko a
delno število. Če je TIMEOUT0,prebrativrača
takoj, ne da bi poskušalprebratikakršni koli podatki se vračajo
samo uspehčevnos je na voljo na določenem
mapadeskriptor. Theizhodstatus večji od128
čečasovna omejitev je prekoračena
-ufdprebratiodmapadeskriptor FD namesto standardnega vhoda

Izhodno stanje:
Thevrnitevkoda je nič, razen če pride do konca datoteke,prebrati kratven
(v ki Ovitekto's več kot 128), napaka pri dodelitvi spremenljivke

Lovljenje uporabniškega vnosa

Interaktivni skripti bash niso nič, če ne ujamete vnosa uporabnika. Vgrajeno branje ponuja metode, ki jih uporabniški vnos lahko ujame v skript bash.

Ulov vrstice vnosa

Če želite prebrati vrstico vnosa, imena in možnosti za branje niso potrebni. Če NAME ni določeno, se za shranjevanje vnosa uporabnika uporabi spremenljivka z imenom REPLY.



Ukazi

{
vrgel ven -n 'Vnesite nekaj in pritisnite enter:';
prebrati;
vrgel venTi si vnesel$ {REPLY}
}

Izhod

Vnesite nekaj in pritisnite enter: nekaj(nova vrstica)
Nekaj ​​si napisal

Lovljenje vhodne besede

Če želite ujeti besedo vnosa, je potrebna možnost -d. V primeru besede, ki jo -d nastavimo na presledek, preberemo '-d'. Takrat, ko uporabnik pritisne preslednico za branje, se naloži REPLY z besedo.

Upoštevajte, da ko je nastavljena možnost -d, povratni prostor ne deluje po pričakovanjih. Za vrnitev v prostor, medtem ko poskušate ujeti besedo vnosa, lahko uporabite možnost -e, preberite -e '-d'.

Ukazi

{
vrgel ven -n 'Vnesite nekaj in pritisnite preslednico:';
prebrati '-d';
vrgel ven '';
vrgel ven 'Ti si vnesel$ {REPLY}'
}

Izhod

Vnesite nekaj in pritisnite preslednico: nekaj(prostor)
Nekaj ​​si napisal

Hitri uporabnik

V interaktivnih skriptih bash uporabnik lahko zahteva sporočilo, ki uporabniku pove, kakšen vnos se pričakuje. To lahko vedno dosežemo z vgrajenim odmevom. Izkazalo pa se je, da obstaja možnost z uporabo branja.

Prosite uporabnika za besedo

Pri ulovu vhodne besede smo uporabili echo, da napišemo Type something in pritisnemo preslednico: na standardni izhod, preden preberemo '-d'. Možnost -p omogoča prikaz sporočila pred branjem s standardnega vnosa.

Ukazi

{
prebrati -str 'Vnesite nekaj in pritisnite preslednico:' '-d';
vrgel ven '';
vrgel ven 'Ti si vnesel$ {REPLY}'
}

Izhod

Vnesite nekaj in pritisnite preslednico: nekaj(prostor)
Nekaj ​​si napisal

Takojšnji uporabnik za skrivnost

Ko ujamete uporabniški vnos, ne da bi se prikazal v terminalu, pride prav možnost -s. read -s -p vam omogoča, da ujamete in skrijete vnos uporabnika na naslednji način.

Ukazi

{
prebrati -s -str 'Vtipkajte nekaj, kar obljubim, da bo skrivnost:'
vrgel ven '';
vrgel ven 'Tvoja skrivnost je pri meni varna';nenastavljenoODGOVORI;
vrgel ven '$ {REPLY}'
}

Izhod

Vnesite nekaj, kar obljubim, da bo skrivnost:
Tvoja skrivnost je pri meni varna

Funkcije z branjem

Tu so primeri funkcij v bashu, ki uporabljajo branje in standardni vnos

Temeljni koncept

Funkcije, ki uporabljajo branje, uporabljajo standardni cevni vhod in parametre. Glavni vhod, ki ga je treba obdelati, kot so vrstice v datoteki, se skozi standardni vhod prenese skozi standardni vhod. Drugi vnosi, če obstajajo, in možnost se posredujejo kot parametri.

prebrati -t 1NAME1 NAME2 ...

prebratijevgrajen ukaz

-t 1 preprečuje, da bash skript neomejeno čaka na vrnitev vrstice s standardnim vnosom. Če je standardni vnos sprva prazen, se funkcija vrne z izhodno kodo 142, ki označuje, da v nastavljenem časovnem obdobju ni bil prebran noben datum

NAME1 NAME2 so imena spremenljivk

... lahko so navedena številna imena spremenljivk

Zdaj, ko so osnova postavljena, poglejmo, kako izgledajo znane funkcije, izvedene z branjem.

Pridružite se funkciji z branjem

Recimo, da želimo funkcijo združevanja, ki vzame seznam besed in vrne drug seznam besed, ki jih združuje ločila. Tukaj je opisano, kako lahko z branjem izvedemo funkcijo združevanja.

Scenarij

#!/bin/bash
## pridruži se
## različica 0.0.2 - popravite parametre rekurzije
#################################################
pridruži se() { { lokalnoomejevalnik;omejevalnik='{1} USD';lokalnoločnica;
izločilnik='$ {2-.}';}
lokalnoavto
lokalnocdr
lokalnoIFS
IFS='$ {indelimiter}'
prebrati -t 1cdr za avto|| vrnitev
preskus '$ {cdr}' || { vrgel ven '$ {car}';vrnitev;}
vrgel ven '$ {car}$ {outdelimiter}$ {cdr}' | $ {FUNCNAME} '$ {indelimiter}'
'$ {outdelimiter}'
}
#################################################
## ustvaril create-stub2.sh v0.1.2
## v ponedeljek, 17. junija 2019 12:24:59 +0900
## glej
#################################################

Vir: join.sh
Ukazna vrstica

vrgel vena b| pridruži se

Izhod

a.b

Ukazna vrstica

vrgel vena b| pridruži se | pridruži se. |

Izhod

do|b

Kartiranje funkcij s pomočjo branja

Recimo, da želimo funkcijo zemljevida, ki vzame seznam in vrne drug seznam, ki vsebuje enako število elementov, ki jih spremeni druga funkcija. Tukaj je opisano, kako lahko z branjem izvedemo funkcijo zemljevida.

Scenarij

#!/bin/bash
## zemljevid
## različica 0.0.1 - začetna
#################################################
zemljevid() { { lokalnoime_funkcije;ime_funkcije='{1} USD';}
lokalnoavto
lokalnocdr
lokalnoIFS
IFS='$ {indelimiter-}'
prebrati -t 1cdr za avto|| vrnitev
preskus '$ (razglasi -f $ {ime_funkcije})' || vrnitev
preskus '$ {car}' || { prav;vrnitev;}
$ {ime_funkcije} $ {car}
vrgel ven '$ {cdr}' | $ {FUNCNAME} '$ {ime_funkcije}'
}
#################################################
## ustvaril create-stub2.sh v0.1.2
## v torek, 18. junija 2019 08:33:49 +0900
## glej
#################################################

Vir: map.sh
Ukazi

NS() { lokalno -jaz jaz={1} USD;vrgel ven$((jaz** 2 ));}
vrgel ven {1..10} |zemljevid pow

Izhod

1
4
9
16
25
36
49
64
81
100

Funkcija filtriranja z branjem

Recimo, da želimo funkcijo filtriranja, ki vzame seznam in vrne pod -seznam elementov, ki zadovoljujejo pogoje, določene z drugo funkcijo. Tukaj je opisano, kako lahko z branjem izvedemo funkcijo filtriranja.

Scenarij

#!/bin/bash
## filter
## različica 0.0.1 - začetna
#################################################
filter() { { lokalnoime_funkcije;ime_funkcije='{1} USD';}
lokalnoavto
lokalnocdr
lokalnoIFS
IFS='$ {indelimiter-}'
prebrati -t 1cdr za avto|| vrnitev
preskus '$ (razglasi -f $ {ime_funkcije})' || vrnitev
preskus '$ {car}' || { prav;vrnitev;}
$ {ime_funkcije} '$ {car}' || vrgel ven -n '$ {car}'
vrgel ven '$ {cdr}' | $ {FUNCNAME} '$ {ime_funkcije}'
}
#################################################
## ustvaril create-stub2.sh v0.1.2
## v torek, 18. junija 2019 13:19:54 +0900
## glej
#################################################

Vir: filter.sh

Ukazi

Čuden() { lokalno -jaz jaz={1} USD;preskus !$((jaz% 2 )) -ekv 1;}
vrgel ven {1..10} |filter liho

Izhod

1 3 5 7 9

Zanke z branjem

Zanke, ki uporabljajo branje, omogočajo ponovitev po vrsticah datoteke, ki naj bi bila ustvarjena ali že obstaja.

Osnovna zanka branja za levo stran (lhs)

Imamo ukaz ali funkcijo (lhs), ki lahko ustvari vrstice v datoteki, ki jih je mogoče preoblikovati z uporabo zanke read in while.

Konstruiraj

lhs| medtem prebrati
naredi
prav
Končano
lhs je aukazki vrne seznam vrstic

Ukazi

seq 5 | medtem prebratijaz
naredi
vrgel ven $ {i}
Končano

Izhod

1
2
3
4
5

Osnovna zanka branja za desno stran (rhs)

Imamo datoteko (rhs) z vrsticami, ki jih lahko prečrtamo z uporabo zanke read in while.

Konstruiraj

medtem prebrati
naredi
prav
Končano <rhs

rhs je amapaki vsebuje vrstice

Ukazi

seq 5 >rhs
medtem prebratijaz
naredi
vrgel ven $ {i}
Končano <rhs

Izhod

1
2
3
4
5

Po meri lhs while zanka z uporabo branja

Imamo tok besed, ki bi jih radi prebrali z branjem.

Konstruiraj

(
IFS=''
lhs| medtem prebrati
naredi
prav
Končano
)

lhs je seznam besed

Ukazi

(
IFS=''
vrgel ven {1..5} | medtem prebratijaz
naredi
vrgel ven '$ {i}
Končano
)

Izhod

1 2 3 4 5

Branje s katerega koli fd namesto standardnega vnosa

Vgrajena možnost branja, ki je pogosto nedotaknjena, je tista, ki vam omogoča, da določite, iz katerega deskriptorja datoteke berete, branje -u FD. Privzeto je FD standardni vhod.

Temeljni koncept

Ko je datoteka odprta, so dodeljeni deskriptorji datotek. Preusmeritev IO v bash omogoča, da datoteko pustite odprto z določenim deskriptorjem datoteke. Dovoljeno nam je pisati v datoteko, brati iz nje in jo zapreti, ko končamo.

_()
{
mačka /dev/nič>myfifo;# prazen myfifo
exec 3<myfifo;# odprite datoteko myfifo kot fd 3
vrgel ven 'Pozdravljen, svet! - od fd 3 ' >myfifo;# piši na myfifo
prebrati -u 3;# preberi vrstico s fd 3
exec 3> &-;# zaprite fd 3
vrgel ven $ {REPLY} # izhodna vrstica odčitana s fd 3 pred zapiranjem
}
_# Pozdravljen, svet! s fd 3

Izdelava vlaka z deskriptorji datotek in branjem -u FD

Samo za zabavo sem se odločil zgraditi vlak z deskriptorji datotek in brati -u FD. Vsakemu deskriptorju datoteke je zapisana številka. Vsak deskriptor datotek bere iz opisnika datotek 1 spodaj in se prilepi vase.

Ukazna vrstica

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

Izhod

inicializiranje fds ...
inicializacija fd3...
fd3inicializiran
inicializacija fd4...
fd4inicializiran
fds inicializiran
branje s fd3in4...
4 3
fds pred čiščenjem
0 1 2 3 4 5
čiščenje ...
čiščenje fds ...
Končanočiščenje fds
fds po čiščenju
0 1 2 3

Preskoči funkcijo z branjem -u FD

Če tečete

uname -za
MINGW64_NT-10,0NAMIZNI STAV-XVVVVVV 2.7.0(0,307/5/3)
2017.-02-17 14:dvajsetx86_64 gospa
bash --verzija
GNUbash, različica 4.4.12(1)-sprostitev(x86_64-pc-msys)

zaradi hrošča je mogoče izvesti funkcijo preskoka, ki preskoči naslednjo vrstico v bash skriptu zunaj funkcij, preden se prebere vir skripta. Upoštevajte, da v večini sistemov ne deluje. Na primer,

uname -za
Linux 4.9.0-8-amd64#1 Debian SMP 4.9.144-3.1 (2019-02-19) x86_64 GNU/Linux
bash --verzija
GNUbash, različica 4.4.12(1)-sprostitev(x86_64-pc-linux-gnu)

skip ne leti.

Funkcija

preskoči() { prebrati -u 31;}

Ukazi

preskoči
vrgel venvrstica preskočena
prav

Izhod

(prazno)

Spodnja črta

Branje, vgrajeno v bash, ne le ujame vnos uporabnika. Uporablja se lahko v funkcijah, zankah in izmenjavah med deskriptorji datotek, ki se uporabljajo v skriptih bash. Včasih lahko raziskovanje z uporabo deskriptorjev branja in datotek da velikonočna jajca.