Bash -lukukomento

Bash Read Command

Lue tai kuole ystävät. Lukukomento on yhtä tärkeä kuin sijaintiparametrit ja echo -komento. Kuinka muuten aiot saada käyttäjän syötteen, hyväksyä salasanat, kirjoittaa toimintoja, silmukan ja kurkistaa tiedostojen kuvauksiin? Jatka lukemista.

Mitä luetaan?

Read on sisäänrakennettu bash -komento, joka lukee rivin sisällön muuttujaksi. Se mahdollistaa sanojen jakamisen, joka on sidottu erityiseen kuoromuuttujaan IFS. Sitä käytetään ensisijaisesti käyttäjän syötteen keräämiseen, mutta sitä voidaan käyttää toimintojen toteuttamiseen, jotka ottavat syötteen vakiotulosta.



Bash lukee sisäänrakennetun komennon ohjeen

Ennen kuin sukellamme lukukomennon käyttämiseen bash -komentosarjoissa, täältä saat apua. Siellä sinun pitäisi nähdä kaikki lukukomennolle käytettävissä olevat vaihtoehdot sekä kuvaukset, joita yritämme käsitellä esimerkeissä.



Komentorivi



auta lukea

Lähtö

lukea:lukea [-ihmiset] [-matriisi] [-d jaa] [-i tekstiä] [-nchars] [-N nchars]
[-p kehote] [-aikakatkaisu] [-u fd] [nimi ...]

Lue rivi vakiotulosta jajakaasen kenttiin.

Lukee yhden rivin vakiotulosta taitiedostokuvaaja FD
josthe-ulisävaruste toimitetaan. Linja onjakaapelloillekutensanan kanssa
jakaminen, ja ensimmäinen sana annetaan ensimmäiselle NIMELLE, toinen sana
sana toiselle NIMELLE ja niin edelleen, ja kaikki jäljelle jääneet sanat on määritetty
thekestääNIMI. Vain hahmot löytyivätsisään $ IFStunnistetaankutensana
erottimet.

Jos nimiä ei toimiteta, linjalukeaon tallennettusisäänREPLY -muuttuja.

Vaihtoehdot:
-kohteeseenarray määrittää sanatlukeataulukon peräkkäisiin indekseihin
muuttuja ARRAY, alkaen nollasta
-drajatajatkaa siihen asti kunDELIMin ensimmäinen merkki onlukea, pikemminkin
kuin uusi rivi
-Käytä Readlinea saadaksesi linjansisääninteraktiivinen kuori
-ikäytä tekstiä TEXTkutenalkuperäinen tekstivartenLue rivi
-nncharspalataNCHARS -merkkien lukemisen jälkeen odottamisen sijaan
vartenuusi rivi, mutta kunnioita erotintajosvähemmän kuin

NCHARS -merkkiä ovatlukeaennen erotinta
-Nncharspalatavasta NCHARS -merkkien lukemisen jälkeen, ellei
EOF havaitaan tailukea ajatulos jättämättä mitään huomiotta
erotin
-pkehote antaa merkkijonon PROMPT ilman peräkkäistä uutta viivaa ennen
yrittäälukea
-rtehdäälä anna käänteisviivojen välttää merkkejä
-stehdäeiheitti poistulo tulee päätelaitteesta
-tAikalisäaikaulos japalataepäonnistuminenjoskohteeseensaattaa loppuunrivi
syöttö ei olelukeaTIMEOUT sekunnin kuluessa. Arvo
TMOUT -muuttuja on oletusaikakatkaisu. TIMEOUT voi olla a
murtoluku. Jos TIMEOUT on0,lukeapalaa
heti yrittämättälukeakaikki tiedot, palautetaan
vain menestysjossyöttö on käytettävissä määritetyssä
tiedostokuvaaja. Thepoistuatila on suurempi kuin128
josaikakatkaisu ylittyy
-ufdlukeaalkaentiedostokuvaaja FD vakiotulon sijaan

Poistu -tila:
Thepalatakoodi on nolla, ellei tiedoston loppua havaita,lukea ajatulos
(sisään joka tapausseon suurempi kuin 128), muuttujanmääritysvirhe

Käyttäjän syöttö

Interaktiiviset bash -komentosarjat eivät ole mitään ilman käyttäjän panosta. Sisäänrakennettu luku tarjoaa menetelmiä, joiden avulla käyttäjän syöttö voidaan sisällyttää bash -komentosarjaan.

Syöttölinjan sieppaus

Syöttöviivan sieppaaminen ei edellytä lukemista NIMET ja vaihtoehdot. Kun NAME -arvoa ei ole määritetty, REPLY -nimistä muuttujaa käytetään käyttäjän syöttämien tietojen tallentamiseen.



Komennot

{
heitti pois -n 'Kirjoita jotain ja paina enter:';
lukea;
heitti poisKirjoitit$ {REPLY}
}

Lähtö

Kirjoita jotain ja paina enter: jotain(uusi rivi)
Kirjoitit jotain

Syötteen sana

Syöttösanan saamiseksi tarvitaan -d -vaihtoehto. Sanan tapauksessa asetamme välilyönniksi -d, lue '-d'. Tällöin käyttäjä painaa välilyöntiä lukee lataa REPLY sanan kanssa.

Huomaa, että kun -d -vaihtoehto on asetettu, askelpalautin ei toimi odotetulla tavalla. Palautusnäppäintä käytettäessä syötesanaa pyydettäessä voidaan käyttää -e -vaihtoehtoa, luku -e ‘-d’.

Komennot

{
heitti pois -n 'Kirjoita jotain ja paina välilyöntiä:';
lukea '' d '';
heitti pois '';
heitti pois 'Kirjoitit$ {REPLY}''
}

Lähtö

Kirjoita jotain ja paina välilyöntiä: jotain(tilaa)
Kirjoitit jotain

Nopea käyttäjä

Vuorovaikutteisissa bash -komentosarjoissa käyttäjä voi pyytää viestin kertomaan käyttäjälle, mitä syötettä odotetaan. Voimme aina tehdä tämän käyttämällä kaikua. On kuitenkin käynyt ilmi, että lukemalla on vaihtoehto.

Pyydä käyttäjää sanomaan sana

Kun otimme syötteen sanan, käytimme kaiun avulla Kirjoita jotain ja paina välilyöntiä: vakiolähtöön ennen kuin luet '-d'. -P -vaihtoehto mahdollistaa viestin näyttämisen ennen lukemista vakiotulosta.

Komennot

{
lukea -p 'Kirjoita jotain ja paina välilyöntiä:' '' d '';
heitti pois '';
heitti pois 'Kirjoitit$ {REPLY}''
}

Lähtö

Kirjoita jotain ja paina välilyöntiä: jotain(tilaa)
Kirjoitit jotain

Pyydä käyttäjältä salaisuus

Kun pyydät käyttäjän tietoja ilman, että se näkyy päätelaitteessa, -s -vaihtoehto on kätevä. read -s -p: n avulla voit siepata ja piilottaa käyttäjän syötteet seuraavasti.

Komennot

{
lukea -s -p 'Kirjoita jotain lupaan pitää sen salassa:'
heitti pois '';
heitti pois 'Salaisuutesi on turvassa kanssani';asetettuVASTAA ;
heitti pois ''$ {REPLY}''
}

Lähtö

Kirjoita jotain, jonka lupaan pitää salassa:
Salaisuutesi on turvassa kanssani

Lukutoiminnot

Tässä on esimerkkejä toiminnoista bashissa, jotka käyttävät luku- ja vakiosyöttöä

Ydinkonsepti

Lukutoiminnot käyttävät putkimaista vakiotuloa ja parametreja. Prosessin pääsyöttö, kuten tiedoston rivit, johdetaan sisään vakiotulon kautta putken kautta. Muut syötteet, jos on, ja vaihtoehto syötetään parametreiksi.

lukea -t 1NAME1 NAME2 ...

lukeaonsisäänrakennettu komento

-t 1 estää bash -komentosarjaa odottamasta loputtomasti rivin palautusta vakiosyötön kautta. Jos vakiotulo on aluksi tyhjä, funktio palaa 142: n poistumiskoodilla, mikä osoittaa, ettei päivämäärää ole luettu asetetun aikakatkaisuajan kuluessa

NAME1 NAME2 ovat muuttujien nimiä

... monia muuttujien nimiä voidaan luetella

Nyt kun perusteet on asetettu, katsotaan miltä tutut toiminnot näyttävät toteutetuilta lukemisen avulla.

Liity toiminto lukemalla

Oletetaan, että haluamme yhdistämisfunktion, joka ottaa sanaluettelon ja palauttaa toisen sanaluettelon, johon on liitetty erotin. Näin voimme toteuttaa liittymistoiminnon lukemisen avulla.

Käsikirjoitus

#!/bin/bash
## liittyä seuraan
## versio 0.0.2 - korjaa rekursioparametrit
##################################################
liittyä seuraan() { { paikallinenrajoitin;rajoitin=''{1-} $'';paikallinenulkorajoitin;
ulkorajoitin=''$ {2-.}'';}
paikallinenauto
paikallinencdr
paikallinenIFS
IFS=''$ {indelimiter}''
lukea -t 1auton cdr|| palata
testata ''$ {cdr}'' || { heitti pois ''$ {auto}'';palata;}
heitti pois ''$ {auto}$ {outdelimiter}$ {cdr}'' | $ {FUNCNAME} ''$ {indelimiter}''
''$ {outdelimiter}''
}
##################################################
## luotu create-stub2.sh v0.1.2
## ma, 17. kesäkuuta 2019 12:24:59 +0900
## katso
##################################################

Lähde: join.sh
Komentorivi

heitti poisa b| liittyä seuraan

Lähtö

a.b

Komentorivi

heitti poisa b| liittyä seuraan | liittyä seuraan. |

Lähtö

kohteeseen|b

Karttatoiminnot lukemisen avulla

Oletetaan, että haluamme karttatoiminnon, joka ottaa luettelon ja palauttaa toisen luettelon, joka sisältää saman määrän elementtejä, joita toinen funktio muuttaa. Näin voimme toteuttaa karttatoiminnon lukemisen avulla.

Käsikirjoitus

#!/bin/bash
## kartta
## versio 0.0.1 - alkuperäinen
##################################################
kartta() { { paikallinenfunktion_nimi;funktion_nimi=''{1} $'';}
paikallinenauto
paikallinencdr
paikallinenIFS
IFS=''$ {indelimiter-}''
lukea -t 1auton cdr|| palata
testata ''$ (julista -f $ {function_name})'' || palata
testata ''$ {auto}'' || { totta;palata;}
$ {function_name} $ {auto}
heitti pois ''$ {cdr}'' | $ {FUNCNAME} ''$ {function_name}''
}
##################################################
## luotu create-stub2.sh v0.1.2
## ti, 18. kesäkuuta 2019 08:33:49 +0900
## katso
##################################################

Lähde: map.sh
Komennot

NS() { paikallinen -i i={1} $;heitti pois$((i** 2 ));}
heitti pois {1..10} |kartta pow

Lähtö

1
4
9
16
25
36
49
64
81
100

Suodatustoiminto lukemalla

Oletetaan, että haluamme suodatintoiminnon, joka ottaa luettelon ja palauttaa toisen funktion asettamien ehtojen tyydyttävien elementtien alaluettelon. Näin voimme toteuttaa suodatintoiminnon lukemisen avulla.

Käsikirjoitus

#!/bin/bash
## suodatin
## versio 0.0.1 - alkuperäinen
##################################################
suodattaa() { { paikallinenfunktion_nimi;funktion_nimi=''{1} $'';}
paikallinenauto
paikallinencdr
paikallinenIFS
IFS=''$ {indelimiter-}''
lukea -t 1auton cdr|| palata
testata ''$ (julista -f $ {function_name})'' || palata
testata ''$ {auto}'' || { totta;palata;}
$ {function_name} ''$ {auto}'' || heitti pois -n ''$ {auto}''
heitti pois ''$ {cdr}'' | $ {FUNCNAME} ''$ {function_name}''
}
##################################################
## luotu create-stub2.sh v0.1.2
## ti, 18. kesäkuuta 2019 13:19:54 +0900
## katso
##################################################

Lähde: filter.sh

Komennot

outo() { paikallinen -i i={1} $;testata !$((i% 2 )) -ekv 1;}
heitti pois {1..10} |suodatin pariton

Lähtö

1 3 5 7 9

Silmukat lukemisen avulla

Lukemista käyttävillä silmukoilla voit iteroida luotavan tai jo olemassa olevan tiedoston rivejä.

Perus lukusilmukalle vasemmalle puolelle (lhs)

Meillä on komento tai toiminto (lhs), joka voi luoda tiedostoon rivejä, jotka voidaan toistaa luku- ja while -silmukan avulla.

Rakentaa

lhs| sillä aikaa lukea
tehdä
totta
tehty
lhs on akomentojoka palauttaa riviluettelon

Komennot

seuraava 5 | sillä aikaa lukeai
tehdä
heitti pois $ {i}
tehty

Lähtö

1
2
3
4
5

Perusoikeus lukusilmukalle oikealle puolelle (rhs)

Meillä on tiedosto (rhs), jossa on rivejä, jotka voidaan silmukoida luku- ja while -silmukan avulla.

Rakentaa

sillä aikaa lukea
tehdä
totta
tehty <rhs

rhs on atiedostosisältää rivejä

Komennot

seuraava 5 >rhs
sillä aikaa lukeai
tehdä
heitti pois $ {i}
tehty <rhs

Lähtö

1
2
3
4
5

Mukautetut lhs -toiminnot lukemisen aikana

Meillä on sanavirta, jonka haluaisimme kiertää lukemalla.

Rakentaa

(
IFS=''
lhs| sillä aikaa lukea
tehdä
totta
tehty
)

lhs on sanaluettelo

Komennot

(
IFS=''
heitti pois {1..5} | sillä aikaa lukeai
tehdä
heitti pois ''$ {i}
tehty
)

Lähtö

1 2 3 4 5

Lukeminen mistä tahansa fd: stä vakiotulon sijaan

Usein koskemattomana jätetty luku sisäänrakennettu -vaihtoehto on se, jonka avulla voit määrittää, mistä tiedoston kuvaajalta luetaan, lue -u FD. Oletuksena FD: n oletetaan olevan vakiotulo.

Ydinkonsepti

Kun tiedosto avataan Tiedoston kuvaajat määritetään. IO -uudelleenohjaus bashissa sallii tiedoston jättämisen auki tietyllä tiedoston kuvaajalla. Saamme kirjoittaa tiedostoon, lukea siitä ja sulkea sen, kun olemme valmiit.

_()
{
kissa /dev/tyhjä>myfifo;# tyhjä myfifo
toteuttaja 3<myfifo;# avaa tiedosto myfifo nimellä fd 3
heitti pois 'Hei maailma! - alkaen fd 3 ' >myfifo;# kirjoita myfifolle
lukea -u 3;# lue rivi fd 3: sta
toteuttaja 3> &-;# sulje fd 3
heitti pois $ {REPLY} # tulostusrivi luetaan fd 3: sta ennen sulkemista
}
_# Hei maailma! alkaen fd 3

Junan rakentaminen tiedostojen kuvaajalla ja luku -u FD

Vain huvin vuoksi päätin rakentaa junan, jossa on tiedostojen kuvaajat ja luettu -u FD. Jokaiseen tiedoston kuvaajaan kirjoitetaan numero. Kukin tiedostojen kuvaaja lukee alla olevasta tiedoston kuvaajalta 1 ja liittää itsensä.

Komentorivi

lyödälinuxhint.com/rakentaa/test-read-fd.sh juna10

Lähtö

alustetaan fds ...
alustetaan fd3...
fd3intialized
alustetaan fd4...
fd4intialized
fds intialized
lukeminen fd: ltä3ja4...
4 3
fds ennen puhdistusta
0 1 2 3 4 5
puhdistaa ...
fd: n puhdistaminen ...
tehtypuhdistaa fds
fds puhdistuksen jälkeen
0 1 2 3

Ohita toiminto lukemalla -u FD

Jos olet käynnissä

sinä nimi -kohteeseen
MINGW64_NT-10.0Pöytä-XVVVVVV 2.7.0(0,307/5/3)
2017.-02-17 14:kaksikymmentäx86_64 Msys
lyödä --versio
GNUlyödä, versio 4.4.12(1)-vapauta(x86_64-pc-msys)

virheen vuoksi voi olla mahdollista toteuttaa ohitustoiminto, joka ohittaa seuraavan rivin bash -komentosarjassa toimintojen ulkopuolella ennen komentosarjan lähteen lukemista. Huomaa, että se ei toimi useimmissa järjestelmissä. Esimerkiksi,

sinä nimi -kohteeseen
Linux 4.9.0-8-amd64#1 Debian SMP 4.9.144-3.1 (2019-02-19) x86_64 GNU/Linux
lyödä --versio
GNUlyödä, versio 4.4.12(1)-vapauta(x86_64-pc-linux-gnu)

skip ei lennä.

Toiminto

ohita() { lukea -u 31;}

Komennot

ohita
heitti poisrivi ohitettu
totta

Lähtö

(tyhjä)

Bottom line

Sisäänrakennettu bash -lukeminen ei muuta kuin saalista käyttäjän syöttöä. Sitä voidaan käyttää funktioissa, silmukoissa ja vaihdoissa bash -skripteissä käytettävien tiedostojen kuvailijoiden välillä. Joskus etsiminen käyttämällä luku- ja tiedostokuvauksia voi tuottaa pääsiäismunia.