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
Izhod
a.bUkazna vrstica
vrgel vena b| pridruži se | pridruži se. |Izhod
do|bKartiranje 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
vrgel ven {1..10} |zemljevid pow
Izhod
14
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 9Zanke 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.
Konstruirajlhs| medtem prebrati
naredi
prav
Končano
lhs je aukazki vrne seznam vrstic
Ukazi
seq 5 | medtem prebratijaznaredi
vrgel ven $ {i}
Končano
Izhod
12
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.
Konstruirajmedtem prebrati
naredi
prav
Končano <rhs
rhs je amapaki vsebuje vrstice
Ukazi
seq 5 >rhsmedtem 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 5Branje 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 vlak10Izhod
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 -zaMINGW64_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 -zaLinux 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čivrgel 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.