Bash lese kommando

Bash Read Command



Les eller dø venner. Lesekommandoen er like viktig som posisjonsparametere og ekkokommandoen. Hvordan ellers skal du fange brukerinndata, godta passord, skrive funksjoner, sløyfe og kikke inn i filbeskrivelser? Les videre.

Hva leses?

Read er en bash innebygd kommando som leser innholdet i en linje til en variabel. Det gir mulighet for orddeling som er knyttet til den spesielle skallvariabelen IFS. Den brukes først og fremst til å fange brukerinngang, men kan brukes til å implementere funksjoner som tar input fra standardinngang.







Bash read innebygd kommandohjelp

Før vi dykker ned i hvordan du bruker read -kommandoen i bash -skript, får vi slik hjelp. Der bør du se alle tilgjengelige alternativer for read -kommandoen sammen med beskrivelser som vi vil prøve å dekke i eksemplene.



Kommandolinje



hjelp lese

Produksjon





lese:lese [-ere] [-en matrise] [-d del] [-jeg tekst] [-n nchars] [-N nchars]
[-p -melding] [-t timeout] [-u fd] [Navn ...]

Les en linje fra standardinngangen ogdeleden inn i felt.

Leser en enkelt linje fra standardinngangen, eller frafildeskriptor FD
hvisde-ualternativet leveres. Linjen erdeleinn i feltsommed ord
splitting, og det første ordet er tilordnet det første NAME, det andre
ord til det andre NAVN, og så videre, med eventuelle ord som er tilordnet
desisteNAVN. Bare tegnene ble funneti $ IFSblir gjenkjentsomord
avgrensere.

Hvis det ikke er angitt NAVN, er linjenleseer lagretiSVAR -variabelen.

Alternativer:
-tilarray tilordne ordenelesetil sekvensielle indekser i matrisen
variabel ARRAY, starter på null
-davgrenseFortsette førdet første tegnet i DELIM erlese, heller
enn ny linje
-e bruker Readline for å få linjeniet interaktivt skall
-Jegtekst bruk TEKSTsomden innledende tekstentilLeselinje
-nncharskomme tilbakeetter å ha lest NCHARS -tegn i stedet for å vente
tilen ny linje, men respekter en avgrensninghvisfærre enn

NCHARS -tegn erlesefør skilletegn
-Nncharskomme tilbakebare etter å ha lest nøyaktig NCHARS -tegn, med mindre
EOF oppstår ellerlese gangerut, ignorerer noen
avgrensning
-sspør ut strengen PROMPT uten en etterfølgende ny linje før
prøver ålese
-rgjøreikke la skråstreker slippe unna noen tegn
-sgjøreikkekastet utinput som kommer fra en terminal
-tpausetidut ogkomme tilbakefeilhvistilfullstendiglinje av
input er ikkeleseinnen TIMEOUT sekunder. Verdien av
TMOUT -variabelen er standard timeout. TIMEOUT kan være en
brøknummer. Hvis TIMEOUT er0,lesereturnerer
umiddelbart, uten å prøveleseeventuelle data, returnerer
bare suksesshvisinput er tilgjengelig på det angitte
filbeskrivelse. Deexitstatusen er større enn128
hvistidsavbruddet er overskredet
-ufdlesefrafildeskriptor FD i stedet for standardinngang

Avslutt status:
Dekomme tilbakekoden er null, med mindre slutten av filen oppstår,lese gangerute
(i hvilken sakdener større enn 128), en variabel oppgavefeil

Fanger brukerinngang

Interaktive bash -skript er ingenting uten å fange brukerinngang. Den innebygde innlesningen gir metoder for at brukerinngang kan bli fanget i et bash -skript.

Fange en linje med input

For å fange en rekke med input er NAVN og alternativer ikke nødvendig ved å lese. Når NAME ikke er spesifisert, brukes en variabel som heter REPLY for å lagre brukerinndata.



Kommandoer

{
kastet ut -n 'Skriv inn noe og trykk enter:';
lese;
kastet utDu skrev$ {REPLY}
}

Produksjon

Skriv inn noe og trykk enter: noe(ny linje)
Du skrev noe

Fanger et ord av innspill

For å fange et ord med input, er alternativet -d nødvendig. Når det gjelder et ord, setter vi -d til et mellomrom, leser '-d'. Det er når brukeren trykker på mellomromstasten leser vil laste SVAR med ordet.

Vær oppmerksom på at når alternativet -d er angitt, fungerer ikke tilbaketasten som forventet. For å gå tilbake, mens du prøver å fange et ord med input, kan alternativet -e brukes, les -e ‘-d’.

Kommandoer

{
kastet ut -n 'Skriv inn noe og slå mellomrom:';
lese '-d';
kastet ut '';
kastet ut 'Du skrev$ {REPLY}'
}

Produksjon

Skriv inn noe og slå mellomrom: noe(rom)
Du skrev noe

Spør bruker

I interaktive bash -skript kan en bruker be om en melding for å fortelle brukeren hvilken input som forventes. Vi kan alltid oppnå dette ved hjelp av det innebygde ekkoet. Det viser seg imidlertid at det er et alternativ å bruke lese.

Be brukeren om et ord

Ved å fange et inndata, brukte vi ekko til å skrive Skriv noe og slå mellomrom: til standard utgang før du leste ‘-d’. Alternativet -p lar en melding vises før du leser fra standardinngang.

Kommandoer

{
lese -s 'Skriv inn noe og slå mellomrom:' '-d';
kastet ut '';
kastet ut 'Du skrev$ {REPLY}'
}

Produksjon

Skriv inn noe og slå mellomrom: noe(rom)
Du skrev noe

Be brukeren om en hemmelighet

Når du fanger brukerinngang uten at det vises i terminalen, kommer alternativet -s til nytte. read -s -p lar deg fange og skjule brukerinndata som følger.

Kommandoer

{
lese -s -s 'Skriv inn noe jeg lover å holde det hemmelig:'
kastet ut '';
kastet ut 'Din hemmelighet er trygg hos meg';usettSVARE ;
kastet ut '$ {REPLY}'
}

Produksjon

Skriv inn noe jeg lover å holde det hemmelig:
Din hemmelighet er trygg hos meg

Funksjoner ved hjelp av lese

Her er eksempler på funksjoner i bash som bruker read og standard input

Kjernekonsept

Funksjoner som bruker lese, bruker standard input og parametere for rør. Hovedinngang som skal behandles, for eksempel linjer i en fil, sendes inn via standardinngang via et rør. Andre inndata hvis-noen og opsjon sendes inn som parametere.

lese -t 1NAME1 NAME2 ...

leseer eninnebygd kommando

-t 1 forhindrer bash -skriptet i å vente på ubestemt tid på at en linje skal returneres gjennom standardinngang. Hvis standardinngangen opprinnelig er tom, returnerer funksjonen med en utgangskode på 142 som betyr at ingen dato ble lest innen den angitte tidsavbruddsperioden

NAME1 NAME2 er variabelnavn

... mange variabelnavn kan være oppført

Nå som grunnarbeidet er satt, la oss se hvordan kjente funksjoner ser ut som implementert ved hjelp av read.

Bli med i funksjonen ved å lese

Anta at vi vil ha en kombinasjonsfunksjon som tar en liste med ord og returnerer en annen liste med ord som er forbundet med en skilletegn. Slik kan vi implementere en joinfunksjon ved hjelp av read.

Manus

#!/bin/bash
## bli med
## versjon 0.0.2 - fikse rekursjonsparametere
#################################################### #
bli med() { { lokalbegrensning;begrensning='$ {1-}';lokaloutdelimiter;
outdelimiter='$ {2-.}';}
lokalbil
lokalcdr
lokalIFS
IFS='$ {indelimiter}'
lese -t 1bil cdr|| komme tilbake
test '$ {cdr}' || { kastet ut '$ {bil}';komme tilbake;}
kastet ut '$ {bil}$ {outdelimiter}$ {cdr}' | $ {FUNCNAME} '$ {indelimiter}'
'$ {outdelimiter}'
}
#################################################### #
## generert av create-stub2.sh v0.1.2
## på mandag, 17. juni 2019 12:24:59 +0900
## se
#################################################### #

Kilde: bli med.sh
Kommandolinje

kastet uta b| bli med

Produksjon

a.b

Kommandolinje

kastet uta b| bli med | bli med. |

Produksjon

til|b

Kartfunksjoner ved hjelp av lese

Anta at vi vil ha en kartfunksjon som tar en liste og returnerer en annen liste som inneholder samme antall elementer som er endret av en annen funksjon. Her er hvordan vi kan implementere en kartfunksjon ved hjelp av read.

Manus

#!/bin/bash
## kart
## versjon 0.0.1 - initial
#################################################### #
kart() { { lokalfunksjonsnavn;funksjonsnavn='$ {1}';}
lokalbil
lokalcdr
lokalIFS
IFS='$ {indelimiter-}'
lese -t 1bil cdr|| komme tilbake
test '$ (erklær -f $ {function_name})' || komme tilbake
test '$ {bil}' || { ekte;komme tilbake;}
$ {function_name} $ {bil}
kastet ut '$ {cdr}' | $ {FUNCNAME} '$ {function_name}'
}
#################################################### #
## generert av create-stub2.sh v0.1.2
## tir 18. juni 2019 08:33:49 +0900
## se
#################################################### #

Kilde: map.sh
Kommandoer

NS() { lokal -Jeg Jeg=$ {1};kastet ut$((Jeg** 2 ));}
kastet ut {1..10} |kart pow

Produksjon

1
4
9
16
25
36
49
64
81
100

Filterfunksjon ved hjelp av lese

Anta at vi ønsker en filterfunksjon som tar en liste og returnerer en underliste over elementer som tilfredsstiller betingelser satt av en annen funksjon. Her er hvordan vi kan implementere en filterfunksjon ved hjelp av read.

Manus

#!/bin/bash
## filter
## versjon 0.0.1 - initial
#################################################### #
filter() { { lokalfunksjonsnavn;funksjonsnavn='$ {1}';}
lokalbil
lokalcdr
lokalIFS
IFS='$ {indelimiter-}'
lese -t 1bil cdr|| komme tilbake
test '$ (erklær -f $ {function_name})' || komme tilbake
test '$ {bil}' || { ekte;komme tilbake;}
$ {function_name} '$ {bil}' || kastet ut -n '$ {bil}'
kastet ut '$ {cdr}' | $ {FUNCNAME} '$ {function_name}'
}
#################################################### #
## generert av create-stub2.sh v0.1.2
## tir 18. juni 2019 13:19:54 +0900
## se
#################################################### #

Kilde: filter.sh

Kommandoer

merkelig() { lokal -Jeg Jeg=$ {1};test !$((Jeg% 2 )) -ekv 1;}
kastet ut {1..10} |filter odd

Produksjon

1 3 5 7 9

Loops ved hjelp av read

Looper som bruker lese, lar deg gjennomgå linjer i en fil som skal genereres eller allerede finnes.

Grunnleggende mens du leser sløyfe for venstre side (lhs)

Vi har en kommando eller funksjon (lhs) som kan generere linjer i en fil som kan sløyfes gjennom ved hjelp av lese- og en stund -sløyfe.

Konstruer

lhs| samtidig som lese
gjøre
ekte
gjort
lhs er enkommandosom returnerer en liste med linjer

Kommandoer

seq 5 | samtidig som leseJeg
gjøre
kastet ut $ {i}
gjort

Produksjon

1
2
3
4
5

Grunnleggende mens du leser sløyfe for høyre side (rhs)

Vi har en fil (rhs) med linjer som kan sløyfes gjennom lesing og en stund -sløyfe.

Konstruer

samtidig som lese
gjøre
ekte
gjort <rhs

rhs er enfilsom inneholder linjer

Kommandoer

seq 5 >rhs
samtidig som leseJeg
gjøre
kastet ut $ {i}
gjort <rhs

Produksjon

1
2
3
4
5

Egendefinerte lhs mens loop bruker lesing

Vi har en strøm av ord som vi ønsker å gå gjennom ved å lese.

Konstruer

(
IFS=''
lhs| samtidig som lese
gjøre
ekte
gjort
)

lhs er en liste med ord

Kommandoer

(
IFS=''
kastet ut {1..5} | samtidig som leseJeg
gjøre
kastet ut '$ {i}
gjort
)

Produksjon

1 2 3 4 5

Lese fra hvilken som helst fd i stedet for standardinngang

Det innebygde innlesningsalternativet som ofte forblir uberørt, er det som lar deg spesifisere hvilken filbeskrivelse du vil lese fra, lese -u FD. Som standard regnes FD som standardinngang.

Kjernekonsept

Når en fil åpnet filbeskrivelser er tilordnet. IO -omdirigering i bash lar en fil stå åpen med en spesifikk filbeskrivelse. Vi har lov til å skrive til filen, lese fra den og lukke den når vi er ferdige.

_()
{
katt /dev/null>myfifo;# tom myfifo
eksek 3<myfifo;# åpne filen myfifo som fd 3
kastet ut 'Hei Verden! - fra fd 3 ' >myfifo;# skrive til myfifo
lese -u 3;# les linje fra fd 3
eksek 3> &-;# lukk fd 3
kastet ut $ {REPLY} # utgangslinje lest fra fd 3 før stengning
}
_# Hei Verden! fra fd 3

Å bygge et tog med filbeskrivelser og lese -u FD

Bare for moro skyld bestemte jeg meg for å bygge et tog med filbeskrivelser og lese -u FD. Det skrives et tall til hver filbeskrivelse. Hver filbeskrivelse leser fra filbeskrivelsen 1 nedenfor og tilføyer seg selv.

Kommandolinje

bashlinuxhint.com/bygge/test-read-fd.sh tog10

Produksjon

initialiserer fds ...
initialiserer fd3...
fd3intialisert
initialiserer fd4...
fd4intialisert
fds intialisert
leser fra fd3og4...
4 3
fds før opprydding
0 1 2 3 4 5
rydder opp ...
rydde opp i fds ...
gjortrydde opp i fds
fds etter opprydding
0 1 2 3

Hopp over funksjonen ved å lese -u FD

Hvis du løper

uname -til
MINGW64_NT-10,0DESKTOP-XVVVVVV 2.7.0(0,307/5/3)
2017-02-17 14:tjuex86_64 Msys
bash --versjon
GNUbash, versjon 4.4.12(1)-utgivelse(x86_64-pc-msys)

Det kan være mulig på grunn av en feil å implementere en hoppfunksjon som hopper over følgende linje i et bash -skript utenfor funksjonene før scriptkilden leses. Vær oppmerksom på at det ikke fungerer på de fleste systemer. For eksempel,

uname -til
Linux 4.9.0-8-amd64#1 Debian SMP 4.9.144-3.1 (2019-02-19) x86_64 GNU/Linux
bash --versjon
GNUbash, versjon 4.4.12(1)-utgivelse(x86_64-pc-linux-gnu)

skip flyr ikke.

Funksjon

hoppe over() { lese -u 31;}

Kommandoer

hoppe over
kastet utlinje hoppet over
ekte

Produksjon

(tømme)

Bunnlinjen

Innlesningen i bash gjør mer enn å fange brukerinngang. Den kan brukes i funksjoner, sløyfer og utvekslinger mellom filbeskrivere som brukes i bash -skript. Noen ganger kan leting ved hjelp av lese- og filbeskrivelser gi påskeegg.