Bashi lugemise käsk

Bash Read Command

Lugege või surege sõbrad. Käsk lugemine on sama oluline kui positsiooniparameetrid ja kaja käsk. Kuidas muidu kavatsete kasutaja sisendit tabada, paroole aktsepteerida, funktsioone kirjutada, silmuseid loopida ja failide kirjeldustesse piiluda? Loe edasi.

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

viskas väljaa b| liituda

Väljund

a.b

Käsurea

viskas väljaa b| liituda | liituda. |

Väljund

et|b

Kaardifunktsioonid 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

NS() { kohalik -mina i={1} dollarit;viskas välja$((i** 2 ));}
viskas välja {1..10} |kaart Pow

Väljund

1
4
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 9

Silmused 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.

Konstrueeri

lhs| samas loe
teha
tõsi
tehtud
lhs on akäskmis tagastab ridade loendi

Käsud

järg 5 | samas loei
teha
viskas välja $ {i}
tehtud

Väljund

1
2
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.

Konstrueeri

samas loe
teha
tõsi
tehtud <rhs

rhs on afailisisaldavad ridu

Käsud

järg 5 >rhs
samas 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 5

Standardse 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 rong10

Vä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 -juurde
MINGW64_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 -juurde
Linux 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ätma
viskas 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.