Kas tiek lasīts?
Lasīšana ir bash iebūvēta komanda, kas rindas saturu nolasa mainīgajā. Tas ļauj sadalīt vārdus, kas ir saistīti ar īpašo apvalka mainīgo IFS. To galvenokārt izmanto lietotāja ievades uztveršanai, bet to var izmantot, lai ieviestu funkcijas, kuras ievada no standarta ievades.
Bash lasīja iebūvēto komandu palīdzību
Pirms mēs iedziļināmies lasīšanas komandas izmantošanā bash skriptos, šeit ir sniegta palīdzība. Tur jums vajadzētu redzēt visas lasīšanas komandai pieejamās iespējas kopā ar aprakstiem, kurus mēs centīsimies ietvert piemēros.
Komandrinda
palīdzēt lasīt
Izeja
lasīt:lasīt [-ers] [-masīvs] [-d dalīties] [-i teksts] [-nchars] [-N nchars]
[-p uzvedne] [-taimauts] [-u fd] [vārds ...]
Izlasiet rindu no standarta ievades unsadalītto laukos.
Nolasa vienu rindu no standarta ievades vai nofailudeskriptors FD
jaun-utiek piegādāta iespēja. Līnija irsadalītlaukoskāar vārdu
sadalot, un pirmais vārds tiek piešķirts pirmajam NAME, otrais
vārdu otram VĀRDAM un tā tālāk, ar visiem pārpalikušajiem vārdiem
unPēdējaisNAME. Atrastas tikai rakstzīmesiekšā $ IFSir atzītaskāvārds
norobežotāji.
Ja netiek piegādāts neviens nosaukums, līnijalasītir saglabātaiekšāmainīgais REPLY.
Iespējas:
-uzmasīvs piešķir vārduslasītuz masīva secīgajiem indeksiem
mainīgais ARRAY, sākot ar nulli
-dnorobežotTurpināt līdzDELIM pirmais raksturs irlasīt, drīzāk
nekā jauna līnija
-e izmantojiet Readline, lai iegūtu līnijuiekšāinteraktīvs apvalks
-iizmantot tekstu TEXTkāsākotnējais tekstspriekšLasīšanas līnija
-nncharsatgrieztiespēc NCHARS rakstzīmju lasīšanas, nevis gaidīšanas
priekšjauna līnija, bet godājiet norobežotājujamazāk kā
NCHARS rakstzīmes irlasītpirms norobežotāja
-Nncharsatgrieztiestikai pēc precīzi NCHARS rakstzīmju izlasīšanas, ja vien
Sastopama EOF vailasīt reizesārā, ignorējot nevienu
norobežotājs
-lppuzvedne izvada virkni PROMPT bez pēdējās rindiņas
mēģinotlasīt
-rdarītneļaujiet slīpsvītrai izvairīties no rakstzīmēm
-sdarītnēizmest ārāieeja nāk no termināļa
-tpārtraukumslaiksārā unatgrieztiesneveiksmejauzpabeigtslīnija
ievade navlasītTIMEOUT sekunžu laikā. Vērtība
Mainīgais TMOUT ir noklusējuma taimauts. TIMEOUT var būt a
daļskaitlis. Ja taimauts ir0,lasītatgriežas
uzreiz, nemēģinotlasītvisus datus, atgriežot
tikai panākumijaievade ir pieejama norādītajā
failudeskriptors. TheIzejastatuss ir lielāks par128
jataimauts ir pārsniegts
-ufdlasītnofailudeskriptors FD standarta ievades vietā
Iziešanas statuss:
Theatgrieztieskods ir nulle, ja vien netiek konstatēts faila beigas,lasīt reizesārā
(iekšā kuras gadījumātoir lielāks par 128), mainīga piešķiršanas kļūda
Notver lietotāja ievadi
Interaktīvie bash skripti nav nekas, neuztverot lietotāja ievadi. Lasīšanas iebūvētais nodrošina metodes, kā lietotāja ievade var tikt iekļauta bash skriptā.
Ievades rindas uztveršana
Lai uztvertu ievades rindu, lasīšanai nav nepieciešami vārdi un opcijas. Ja NAME nav norādīts, lietotāja ievadītās informācijas glabāšanai tiek izmantots mainīgais ar nosaukumu REPLY.
Komandas
{izmest ārā -n 'Ierakstiet kaut ko un nospiediet enter:';
lasīt;
izmest ārāJūs rakstījāt$ {REPLY}
}
Izeja
Ierakstiet kaut ko un nospiediet enter: kaut(jauna līnija)Jūs kaut ko ierakstījāt
Ievades vārda uztveršana
Lai uztvertu ievades vārdu, ir nepieciešama opcija -d. Vārda gadījumā mēs iestatītu -d uz atstarpi, izlasiet “-d”. Tas ir, kad lietotājs nospiež atstarpes taustiņu, lasītais tiks ielādēts REPLY ar vārdu.
Ņemiet vērā: ja ir iestatīta opcija -d, atpakaļatkāpe nedarbojas, kā paredzēts. Lai atgrieztos atpakaļ, mēģinot uztvert ievades vārdu, var izmantot opciju -e, lasot -e ‘-d’.
Komandas
izmest ārā -n 'Ierakstiet kaut ko un nospiediet atstarpi:';
lasīt '-d';
izmest ārā '';
izmest ārā 'Jūs rakstījāt$ {REPLY}'
}
Izeja
Ierakstiet kaut ko un nospiediet atstarpi: kaut kas(telpa)Jūs kaut ko ierakstījāt
Ātrs lietotājs
Interaktīvos bash skriptos lietotājs var pieprasīt ziņojumu, lai informētu lietotāju par gaidāmo ievadi. Mēs to vienmēr varam paveikt, izmantojot iebūvēto atbalsi. Tomēr izrādās, ka ir iespēja izmantot lasīšanu.
Lūdziet lietotājam vārdu
Ievērojot ievades vārdu, mēs izmantojām atbalsi, lai rakstītu Ierakstiet kaut ko un nospiediet atstarpi: standarta izvadei pirms lasīšanas “-d”. Opcija -p ļauj parādīt ziņojumu pirms lasīšanas no standarta ievades.
Komandas
{lasīt -lpp 'Ierakstiet kaut ko un nospiediet atstarpi:' '-d';
izmest ārā '';
izmest ārā 'Jūs rakstījāt$ {REPLY}'
}
Izeja
Ierakstiet kaut ko un nospiediet atstarpi: kaut kas(telpa)Jūs kaut ko ierakstījāt
Lūdziet lietotājam noslēpumu
Noķerot lietotāja ievadi, to nerādot terminālī, ir noderīga opcija -s. lasīt -s -p ļauj noķert un paslēpt lietotāja ievadīto informāciju šādi.
Komandas
{lasīt -s -lpp 'Ierakstiet kaut ko, ko es apsolu turēt noslēpumā:'
izmest ārā '';
izmest ārā 'Tavs noslēpums ir drošībā ar mani';nav iestatītsREPLY;
izmest ārā '$ {REPLY}'
}
Izeja
Ierakstiet kaut ko, ko es apsolu turēt noslēpumā:Tavs noslēpums ir drošībā pie manis
Funkcijas, izmantojot lasīšanu
Šeit ir bash funkciju piemēri, kas izmanto lasīšanas un standarta ievadi
Galvenā koncepcija
Funkcijas, kas izmanto lasīšanu, izmanto standarta ievadi un parametrus. Galvenā apstrādājamā ievade, piemēram, rindas failā, caur cauruli tiek ievadīta caur standarta ievadi. Cita ievade, ja ir, un opcija tiek nodota kā parametri.
lasīt -t 1NAME1 NAME2 ...lasītiriebūvēts komandu
-t 1 neļauj bash skriptam bezgalīgi gaidīt rindas atgriešanu, izmantojot standarta ievadi. Ja standarta ievade sākotnēji ir tukša, funkcija atgriežas ar izejas kodu 142, kas norāda, ka noteiktajā taimauta periodā netika nolasīts datums
NAME1 NAME2 ir mainīgie nosaukumi... var tikt uzskaitīti daudzi mainīgo nosaukumi
Tagad, kad ir sagatavoti pamatdarbi, redzēsim, kā izskatās pazīstamās funkcijas, kas ieviestas, izmantojot lasīšanu.
Pievienošanās funkcija, izmantojot lasīšanu
Pieņemsim, ka mēs gribam apvienošanas funkciju, kas ņem vārdu sarakstu un atgriež citu vārdu sarakstu, kam pievienots atdalītājs. Lūk, kā mēs varam ieviest pievienošanās funkciju, izmantojot lasīšanu.
Skripts#!/bin/bash
## pievienoties
## versija 0.0.2 - labojiet rekursijas parametrus
#################################################
pievienojies() { { vietējaisierobežotājs;ierobežotājs='{1-} USD';vietējaisnorobežotājs;
atdalītājs='{2-.} ASV dolāri';}
vietējaisautomašīna
vietējaiscdr
vietējaisIFS
IFS='$ {indelimiter}'
lasīt -t 1automašīnas cdr|| atgriezties
pārbaude '$ {cdr}' || { izmest ārā '$ {car}';atgriezties;}
izmest ārā '$ {car}$ {outdelimiter}$ {cdr}' | $ {FUNCNAME} '$ {indelimiter}'
'$ {outdelimiter}'
}
#################################################
## ģenerējis create-stub2.sh v0.1.2
## pirmdien, 2019. gada 17. jūnijā 12:24:59 +0900
## redzēt
#################################################
Avots: pievienoties.sh
Komandrinda
Izeja
a.bKomandrinda
izmest ārāa b| pievienojies | pievienojies. |Izeja
uz|bKartes funkcijas, izmantojot lasīšanu
Pieņemsim, ka mēs vēlamies kartes funkciju, kas ņem sarakstu un atgriež citu sarakstu, kurā ir tāds pats elementu skaits, kurus modificē cita funkcija. Lūk, kā mēs varam ieviest kartes funkciju, izmantojot lasīšanu.
Skripts#!/bin/bash
## karte
## versija 0.0.1 - sākotnējā
#################################################
karte() { { vietējaisfunkcija_nosaukums;funkcija_nosaukums='{1} USD';}
vietējaisautomašīna
vietējaiscdr
vietējaisIFS
IFS='$ {indelimiter-}'
lasīt -t 1automašīnas cdr|| atgriezties
pārbaude '$ (deklarēt -f $ {function_name})' || atgriezties
pārbaude '$ {car}' || { taisnība;atgriezties;}
$ {function_name} $ {car}
izmest ārā '$ {cdr}' | $ {FUNCNAME} '$ {function_name}'
}
#################################################
## ģenerējis create-stub2.sh v0.1.2
## otrdien, 2019. gada 18. jūnijā 08:33:49 +0900
## redzēt
################################################
Avots: karte.sh
Komandas
izmest ārā {1..10} |karte pow
Izeja
14
9
16
25
36
49
64
81
100
Filtrēšanas funkcija, izmantojot lasīšanu
Pieņemsim, ka mēs gribam filtrēšanas funkciju, kas ņem sarakstu un atgriež citu funkciju iestatīto nosacījumu apmierinošo elementu apakšsarakstu. Lūk, kā mēs varam ieviest filtra funkciju, izmantojot lasīšanu.
Skripts#!/bin/bash
## filtrs
## versija 0.0.1 - sākotnējā
#################################################
filtrs() { { vietējaisfunkcija_nosaukums;funkcija_nosaukums='{1} USD';}
vietējaisautomašīna
vietējaiscdr
vietējaisIFS
IFS='$ {indelimiter-}'
lasīt -t 1automašīnas cdr|| atgriezties
pārbaude '$ (deklarēt -f $ {function_name})' || atgriezties
pārbaude '$ {car}' || { taisnība;atgriezties;}
$ {function_name} '$ {car}' || izmest ārā -n '$ {car}'
izmest ārā '$ {cdr}' | $ {FUNCNAME} '$ {function_name}'
}
#################################################
## ģenerējis create-stub2.sh v0.1.2
## otrdien, 2019. gada 18. jūnijā 13:19:54 +0900
## redzēt
#################################################
Avots: filtrs.sh
Komandas
nepāra() { vietējais -i i={1} USD;pārbaude !$((i% 2 )) -ekv 1;}izmest ārā {1..10} |nepāra filtrs
Izeja
1 3 5 7 9Cilpas, izmantojot lasīšanu
Cilpas, kas izmanto lasīšanu, ļauj atkārtot ģenerējamā vai jau esošā faila rindas.
Pamata lasīšanas cilpa kreisajai pusei (lhs)
Mums ir komanda vai funkcija (lhs), kas var ģenerēt rindas failā, ko var atkārtot, izmantojot lasīšanas un brīža cilpu.
Konstruētlhs| kamēr lasīt
darīt
taisnība
darīts
lhs ir akomandukas atgriež rindu sarakstu
Komandas
sek 5 | kamēr lasītidarīt
izmest ārā $ {i}
darīts
Izeja
12
3
4
5
Pamata lasīšanas cilpa labajai pusei (rhs)
Mums ir fails (rhs) ar rindām, kuras var pārvietot, izmantojot lasīšanas un laika ciklu.
Konstruētkamēr lasīt
darīt
taisnība
darīts <rhs
rhs ir afailukas satur līnijas
Komandas
sek 5 >rhskamēr lasīti
darīt
izmest ārā $ {i}
darīts <rhs
Izeja
1
2
3
4
5
Pielāgots lhs cilpas laikā, izmantojot lasīšanu
Mums ir vārdu straume, kuru mēs vēlētos atkārtot, izmantojot lasīšanu.
Konstruēt(
IFS=''
lhs| kamēr lasīt
darīt
taisnība
darīts
)
lhs ir vārdu saraksts
Komandas
(IFS=''
izmest ārā {1..5} | kamēr lasīti
darīt
izmest ārā '$ {i}
darīts
)
Izeja
1 2 3 4 5Lasīšana no jebkuras fd, nevis standarta ievades
Lasīšanas iebūvētā opcija, kas bieži tiek atstāta neskarta, ir tā, kas ļauj norādīt, no kāda faila apraksta lasīt, lasīt -u FD. Pēc noklusējuma FD tiek uzskatīta par standarta ievadi.
Galvenā koncepcija
Atverot failu, tiek piešķirti failu deskriptori. IO novirzīšana bash ļauj failu atstāt atvērtu ar noteiktu faila aprakstu. Mums ir atļauts rakstīt failā, lasīt no tā un aizvērt to, kad esam pabeiguši.
_(){
kaķis /dev/null>myfifo;# tukšs myfifo
izpildītājs 3<myfifo;# atveriet failu myfifo kā fd 3
izmest ārā 'Sveika pasaule! - no fd 3 ' >myfifo;# rakstiet myfifo
lasīt -u 3;#lasa rindu no fd 3
izpildītājs 3> &-;# aizvērt fd 3
izmest ārā $ {REPLY} # izvades līnija nolasīta no fd 3 pirms aizvēršanas
}
_# Sveika pasaule! no fd 3
Vilciena būvēšana ar failu aprakstiem un lasāmu -u FD
Vienkārši prieka pēc es nolēmu uzbūvēt vilcienu ar failu aprakstiem un izlasīt -u FD. Katram faila deskriptoram tiek rakstīts numurs. Katrs faila deskriptors nolasa no 1. faila deskriptora un pievieno sev.
Komandrinda
bashlinuxhint.com/būvēt/test-read-fd.sh vilciens10Izeja
fds inicializēšana ...inicializēšana fd3...
fd3intializēts
inicializēšana fd4...
fd4intializēts
fds intializēts
lasot no fd3un4...
4 3
fds pirms tīrīšanas
0 1 2 3 4 5
satīrīšana ...
fds tīrīšana ...
darītstīrīšana fds
fds pēc tīrīšanas
0 1 2 3
Izlaist funkciju, izmantojot lasīšanas -u FD
Ja skrien
nepiedien -uzMINGW64_NT-10.0GALDAPLAUKS-XVVVVVV 2.7.0(0.307/5/3)
2017. gads.-02-17 14:divdesmitx86_64 Msys
bash --versija
GNUbash, versija 4.4.12(1)-atlaidiet(x86_64-pc-msys)
kļūdas dēļ var būt iespējams ieviest izlaišanas funkciju, kas pirms skripta avota nolasīšanas izlaiž šādu rindu bash skriptā ārpus funkcijām. Ņemiet vērā, ka tas nedarbojas lielākajā daļā sistēmu. Piemēram,
nepiedien -uzLinux 4.9.0-8-amd64#1 Debian SMP 4.9.144-3.1 (2019-02-19) x86_64 GNU/Linux
bash --versija
GNUbash, versija 4.4.12(1)-atlaidiet(x86_64-pc-linux-gnu)
skip nelido.
Funkcija
izlaist() { lasīt -u 31;}
Komandas
izlaistizmest ārārinda izlaista
taisnība
Izeja
(tukšs)Apakšējā līnija
Bash iebūvētā lasīšana sniedz vairāk nekā tikai lietotāju ievadi. To var izmantot funkcijās, cilpās un apmaiņā starp failu aprakstiem, ko izmanto bash skriptos. Dažkārt, izmantojot lasīšanas un failu aprakstus, var iegūt Lieldienu olas.