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
Produksjon
a.bKommandolinje
kastet uta b| bli med | bli med. |Produksjon
til|bKartfunksjoner 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
kastet ut {1..10} |kart pow
Produksjon
14
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 9Loops 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.
Konstruerlhs| samtidig som lese
gjøre
ekte
gjort
lhs er enkommandosom returnerer en liste med linjer
Kommandoer
seq 5 | samtidig som leseJeggjøre
kastet ut $ {i}
gjort
Produksjon
12
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.
Konstruersamtidig som lese
gjøre
ekte
gjort <rhs
rhs er enfilsom inneholder linjer
Kommandoer
seq 5 >rhssamtidig 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 5Lese 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 tog10Produksjon
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 -tilMINGW64_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 -tilLinux 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 overkastet 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.