Mida loetakse?
Read on sisseehitatud bash -käsk, mis loeb rea sisu muutujaks. See võimaldab sõnade jagamist, mis on seotud spetsiaalse kesta muutujaga IFS. Seda kasutatakse peamiselt kasutaja sisendi püüdmiseks, kuid seda saab kasutada funktsioonide rakendamiseks, mis võtavad sisendit tavalisest sisendist.
Bash luges sisseehitatud käskude abi
Enne kui sukeldume sellesse, kuidas bash -skriptides käsku read kasutada, saame siit abi. Seal peaksite nägema kõiki lugemiskäsule saadaolevaid valikuid koos kirjeldustega, mida proovime näidetes katta.
Käsurea
abi loe
Väljund
loe:loe [-mehed] [-massiiv] [-d jagada] [-tekst] [-nchars] [-N nchars]
[-p viip] [-aegumine] [-u fd] [nimi ...]
Lugege rida tavalisest sisendist jalõhenemasee põldudeks.
Loeb ühe rea tavalisest sisendist võifailideskriptor FD
kuithe-uvalik on kaasas. Rida onlõhenemaväljadelenagusõnaga
jagamine ja esimene sõna määratakse esimesele NIMELE, teine sõna
sõna teisele NIMELE ja nii edasi, jättes allesjäänud sõnad
theviimaneNIMI. Leiti ainult tegelasedsisse $ IFSon tunnustatudnagusõna
eraldajad.
Kui ühtegi nime ei ole kaasas, siis ridaloeon salvestatudsissemuutuja REPLY.
Valikud:
-juurdemassiiv määrab sõnadloemassiivi järjestikustele indeksitele
muutuja ARRAY, alustades nullist
-dpiiritlemajätkata kuniDELIMi esimene märk onloe, pigem
kui uusliin
-e kasutage joone saamiseks Readline'isisseinteraktiivne kest
-minakasutage teksti TEXTnaguesialgne teksteestLugemisliin
-nncharstagasipärast NCHARS -i tegelaste lugemist, mitte ootamist
eestuus rida, kuid austa eraldajatkuivähem kui
NCHARS tähemärki onloeenne eraldajat
-Nncharstagasialles pärast täpselt NCHARS -i tähemärkide lugemist, välja arvatud juhul
EOF ilmneb võiloe kordavälja, eirates ühtegi
eraldaja
-lkviip väljastab stringi PROMPT ilma lõppu uue reata
püüdesloe
-rtehaärge lubage tagasilööke märkide eest põgeneda
-stehamitteviskas väljasisend tuleb terminalist
-taeg mahaaegavälja jatagasiebaõnnestuminekuiettäielikrida
sisend ei oleloeTIMEOUT sekundi jooksul. Väärtus
Muutuja TMOUT on vaikimisi ajalõpp. TIMEOUT võib olla a
murdarv. Kui TIMEOUT on0,loenaaseb
kohe, proovimataloekõik andmed, tagastades
ainult edukuisisend on saadaval määratud
failideskriptor. Theväljuminestaatus on suurem kui128
kuiaeg on ületatud
-ufdloealatesfailideskriptor FD tavalise sisendi asemel
Väljumise olek:
Thetagasikood on null, kui faili lõppu ei leita,loe kordavälja
(sisse mis juhtumsedaon suurem kui 128), muutuja määramise viga
Kasutaja sisendi püüdmine
Interaktiivsed bash -skriptid pole midagi, ilma et kasutajat sisendit püüdaks. Sisseehitatud lugemine pakub meetodeid, mille abil kasutaja sisend võidakse püüda bash -skripti.
Sisendi rea püüdmine
Sisestusrea püüdmiseks ei pea lugemine nõudma NIMI ja valikuid. Kui NAME pole määratud, kasutatakse kasutaja sisendi salvestamiseks muutuja nimega REPLY.
Käsud
{viskas välja -n 'Sisestage midagi ja vajutage sisestusklahvi:';
loe;
viskas väljaTe kirjutasite$ {REPLY}
}
Väljund
Sisestage midagi ja vajutage sisestusklahvi: midagi(uus rida)Sa kirjutasid midagi
Sisestussõna püüdmine
Sisestussõna tabamiseks on vaja valikut -d. Sõna puhul määraksime -d tühikuks, loeme ‘-d’. See on siis, kui kasutaja vajutab tühikut, lugedes laaditakse sõna REPLY.
Pange tähele, et kui on seadistatud suvand -d, ei tööta tagasilükkeklapp ootuspäraselt. Tagasilükkamiseks võib sisestussõna püüdmisel kasutada valikut -e, lugedes -e ‘-d’.
Käsud
viskas välja -n 'Sisestage midagi ja vajutage tühikut:';
loe '-d';
viskas välja '';
viskas välja 'Sa kirjutasid$ {REPLY}'
}
Väljund
Sisestage midagi ja vajutage tühikut: midagi(ruumi)Sa kirjutasid midagi
Kiire kasutaja
Interaktiivsetes bash -skriptides võib kasutaja paluda sõnumit, mis teavitab kasutajat oodatavast sisendist. Saame seda alati teha, kasutades sisseehitatud kaja. Siiski selgub, et lugemise abil on olemas valik.
Küsige kasutajalt sõna
Sisendsõna püüdmisel kasutasime kaja, et kirjutada Tüüp midagi ja vajutada tühikut: standardväljundile enne „-d“ lugemist. Valik -p võimaldab enne standardsisendist lugemist kuvada teate.
Käsud
{loe -lk 'Sisestage midagi ja vajutage tühikut:' '-d';
viskas välja '';
viskas välja 'Sa kirjutasid$ {REPLY}'
}
Väljund
Sisestage midagi ja vajutage tühikut: midagi(ruumi)Sa kirjutasid midagi
Küsige kasutajalt saladust
Kasutaja sisendi püüdmisel, ilma et see terminalis ilmuks, on -s -valik kasulik. read -s -p võimaldab kasutajate sisendeid tabada ja peita järgmiselt.
Käsud
{loe -s -lk 'Sisestage midagi, mida ma luban saladuses hoida:'
viskas välja '';
viskas välja 'Teie saladus on minuga kaitstud';seadistamataVASTUS;
viskas välja '$ {REPLY}'
}
Väljund
Sisestage midagi, mida luban saladuses hoida:Teie saladus on minuga kaitstud
Funktsioonid lugemise abil
Siin on näited bashi funktsioonidest, mis kasutavad lugemist ja standardset sisendit
Põhikontseptsioon
Lugemist kasutavad funktsioonid kasutavad standardset sisendit ja parameetreid. Protsessi peamine sisend, näiteks failis olevad read, suunatakse toru kaudu standardsisendi kaudu. Muu sisend, kui on, ja valik edastatakse parameetritena.
loe -t 1NAME1 NAME2 ...loeonsisseehitatud käsk
-t 1 ei lase bash -skriptil lõputult oodata, kuni rida tagastatakse standardsisendi kaudu. Kui standardsisend on esialgu tühi, naaseb funktsioon väljumiskoodiga 142, mis tähendab, et määratud ajavahemiku jooksul ei loetud kuupäeva
NAME1 NAME2 on muutujate nimed... võib olla loetletud palju muutujate nimesid
Nüüd, kui eeltööd on paika pandud, vaatame, millised tuttavad funktsioonid näevad välja, kasutades lugemist.
Liitumisfunktsioon lugemise abil
Oletame, et tahame liitmisfunktsiooni, mis võtab sõnade loendi ja tagastab teise sõnade loendi, mis on ühendatud eraldajaga. Siit saate teada, kuidas saame rakendada liitumisfunktsiooni lugemise abil.
Stsenaarium#!/bin/bash
## liitu
## versioon 0.0.2 - parandage rekursiooni parameetrid
###########################################
liituda() { { kohalikpiiraja;piiraja='{1-} dollarit';kohalikpiirjoon;
piirjoon='{2-.} Dollarit';}
kohalikauto
kohalikcdr
kohalikIFS
IFS='$ {indelimiter}'
loe -t 1auto cdr|| tagasi
test '$ {cdr}' || { viskas välja '$ {auto}';tagasi;}
viskas välja '$ {auto}$ {outdelimiter}$ {cdr}' | $ {FUNCNAME} '$ {indelimiter}'
'$ {outdelimiter}'
}
###########################################
## loodud create-stub2.sh v0.1.2
## esmaspäeval, 17. juunil 2019 12:24:59 +0900
## vaata
###########################################
Allikas: liitu.sh
Käsurea
Väljund
a.bKäsurea
viskas väljaa b| liituda | liituda. |Väljund
et|bKaardifunktsioonid lugemise abil
Oletame, et tahame kaardifunktsiooni, mis võtab loendi ja tagastab teise loendi, mis sisaldab sama arvu elemente, mida on muudetud teise funktsiooniga. Siin on, kuidas saame rakendada kaardifunktsiooni lugemise abil.
Stsenaarium#!/bin/bash
## kaart
## versioon 0.0.1 - esialgne
###########################################
kaart() { { kohalikfunktsiooni_nimi;funktsiooni_nimi='{1} dollarit';}
kohalikauto
kohalikcdr
kohalikIFS
IFS='$ {indelimiter-}'
loe -t 1auto cdr|| tagasi
test '$ (deklareeri -f $ {function_name})' || tagasi
test '$ {auto}' || { tõsi;tagasi;}
$ {function_name} $ {auto}
viskas välja '$ {cdr}' | $ {FUNCNAME} '$ {function_name}'
}
###########################################
## loodud create-stub2.sh v0.1.2
## teisipäeval, 18. juunil 2019 08:33:49 +0900
## vaata
###########################################
Allikas: kaart.sh
Käsud
viskas välja {1..10} |kaart Pow
Väljund
14
9
16
25
36
49
64
81
100
Filtreerimisfunktsioon lugemise abil
Oletame, et tahame filtrifunktsiooni, mis võtab nimekirja ja tagastab teise funktsiooni seatud tingimusi rahuldavate elementide alamloendi. Siit saate teada, kuidas saame rakendada filtri funktsiooni lugemise abil.
Stsenaarium#!/bin/bash
## filter
## versioon 0.0.1 - esialgne
###########################################
filter() { { kohalikfunktsiooni_nimi;funktsiooni_nimi='{1} dollarit';}
kohalikauto
kohalikcdr
kohalikIFS
IFS='$ {indelimiter-}'
loe -t 1auto cdr|| tagasi
test '$ (deklareeri -f $ {function_name})' || tagasi
test '$ {auto}' || { tõsi;tagasi;}
$ {function_name} '$ {auto}' || viskas välja -n '$ {auto}'
viskas välja '$ {cdr}' | $ {FUNCNAME} '$ {function_name}'
}
###########################################
## loodud create-stub2.sh v0.1.2
## teisipäeval, 18. juunil 2019 13:19:54 +0900
## vaata
###########################################
Allikas: filter.sh
Käsud
kummaline() { kohalik -mina i={1} dollarit;test !$((i% 2 )) -ekv 1;}viskas välja {1..10} |filter veider
Väljund
1 3 5 7 9Silmused lugemise abil
Lugemist kasutavad tsüklid võimaldavad teil genereeritava või juba olemasoleva faili ridade kaudu itereerida.
Põhiline lugemisahel vasakule küljele (lhs)
Meil on käsk või funktsioon (lhs), mis võib genereerida failis ridu, mida saab lugemis- ja mõnda aega kasutades kasutada.
Konstrueerilhs| samas loe
teha
tõsi
tehtud
lhs on akäskmis tagastab ridade loendi
Käsud
järg 5 | samas loeiteha
viskas välja $ {i}
tehtud
Väljund
12
3
4
5
Põhiline lugemisahel paremale küljele (rhs)
Meil on fail (rhs), millel on read, mida saab lugemis- ja while -tsükli abil läbi viia.
Konstrueerisamas loe
teha
tõsi
tehtud <rhs
rhs on afailisisaldavad ridu
Käsud
järg 5 >rhssamas loei
teha
viskas välja $ {i}
tehtud <rhs
Väljund
1
2
3
4
5
Kohandatud lhs lugemise ajal
Meil on sõnade voog, millest tahaksime lugemise abil läbi vaadata.
Konstrueeri(
IFS=''
lhs| samas loe
teha
tõsi
tehtud
)
lhs on sõnade loend
Käsud
(IFS=''
viskas välja {1..5} | samas loei
teha
viskas välja '$ {i}
tehtud
)
Väljund
1 2 3 4 5Standardse sisendi asemel lugemine mis tahes fd -lt
Sageli puutumata jäetud sisseehitatud lugemisvalik võimaldab teil määrata, millisest failikirjeldusest lugeda, lugeda -u FD. FD on vaikimisi standardsisend.
Põhikontseptsioon
Faili avamisel määratakse failide kirjeldused. IO ümbersuunamine bashis võimaldab faili jätta avatuks konkreetse failikirjeldusega. Meil on lubatud faili kirjutada, sealt lugeda ja see lõpetada, kui oleme lõpetanud.
_(){
kass /arendaja/null>myfifo;# tühi myfifo
täideviija 3<myfifo;# avage fail myfifo kui fd 3
viskas välja 'Tere, Maailm! - alates fd 3 ' >myfifo;# kirjutage myfifole
loe -u 3;# loe rida fd 3 -st
täideviija 3> &-;# sulgege fd 3
viskas välja $ {REPLY} # väljundrida loeti fd 3 -st enne sulgemist
}
_# Tere, Maailm! alates fd 3
Rongi ehitamine failide kirjelduste ja -u FD -ga
Nalja pärast otsustasin ehitada rongi koos failide kirjeldustega ja lugeda -u FD. Igale failikirjeldusele kirjutatakse number. Iga failikirjeldus loeb allpool olevast failikirjeldusest 1 ja lisab selle enda juurde.
Käsurea
löömalinuxhint.com/ehitada/test-read-fd.sh rong10Väljund
fds lähtestamine ...initsialiseerimine fd3...
fd3intialiseeritud
initsialiseerimine fd4...
fd4intialiseeritud
fds intialiseeritud
lugemine fd -st3ja4...
4 3
fds enne puhastamist
0 1 2 3 4 5
koristamine ...
fd puhastamine ...
tehtudfds puhastamine
fds pärast puhastamist
0 1 2 3
Funktsiooni vahelejätmine lugemise -u FD abil
Kui sa jooksed
uname -juurdeMINGW64_NT-10,0LAUA-XVVVVVV 2.7.0(0,307/5/3)
2017.-02-17 14:kakskümmendx86_64 Msys
lööma --versioon
GNUlööma, versioon 4.4.12(1)-vabastada(x86_64-pc-msys)
vea tõttu võib olla võimalik rakendada vahelejätmisfunktsiooni, mis jätab enne skripti allika lugemist vahele bash -skripti järgmise rea väljaspool funktsioone. Pange tähele, et see ei tööta enamikus süsteemides. Näiteks,
uname -juurdeLinux 4.9.0-8-amd64#1 Debiani SMP 4.9.144-3.1 (2019-02-19) x86_64 GNU/Linux
lööma --versioon
GNUlööma, versioon 4.4.12(1)-vabastada(x86_64-pc-linux-gnu)
vahele ei lenda.
Funktsioon
vahele jätma() { loe -u 31;}
Käsud
vahele jätmaviskas väljarida vahele
tõsi
Väljund
(tühi)Alumine joon
Sisseehitatud bash -i lugemine teeb enamat kui püüab kasutaja sisendit. Seda saab kasutada bash -skriptides kasutatavate funktsioonide, silmuste ja failide kirjelduste vaheliste vahetuste jaoks. Mõnikord võib lugemis- ja failikirjelduste abil uurimine anda lihavõttemune.