Bash skaitymo komanda

Bash Read Command



Skaityk arba mirsi draugai. Skaitymo komanda yra tokia pat svarbi kaip padėties parametrai ir komanda echo. Kaip dar ketinate sugauti vartotojo įvestį, priimti slaptažodžius, rašyti funkcijas, ciklus ir žvilgtelėti į failų aprašus? Skaityk.

Kas skaitoma?

Skaitymas yra „bash builtin“ komanda, kuri nuskaito eilutės turinį į kintamąjį. Tai leidžia skaidyti žodžius, susietus su specialiu apvalkalo kintamuoju IFS. Jis visų pirma naudojamas vartotojo įvesties gaudymui, tačiau gali būti naudojamas funkcijoms įgyvendinti, naudojant įvestį iš standartinės įvesties.







Bash skaityti integruotą komandų pagalbą

Prieš pasinerdami į tai, kaip naudoti komandą skaityti „bash“ scenarijuose, štai kaip mes gauname pagalbą. Čia turėtumėte pamatyti visas skaitymo komandos parinktis ir aprašymus, kuriuos bandysime pateikti pavyzdžiuose.



Komandinė eilutė



padėti skaityti

Išvestis





skaityti:skaityti [-žmonės] [-masyvas] [-d dalintis] [-i tekstas] [-n nchars] [-N nchars]
[-p raginimas] [-skirtasis laikas] [-u fd] [vardas ...]

Perskaitykite eilutę iš standartinio įvesties irsuskaldytijį į laukus.

Skaito vieną eilutę iš standartinės įvesties arba išfailądeskriptorius FD
jeiį-upateikiama parinktis. Linija yrasuskaldytiį laukuskaipsu žodžiu
suskaidymas, o pirmasis žodis priskiriamas pirmajam VARDUI, antrasis
žodį antrajam VARDUI ir pan., priskiriant likusius žodžius
įpaskutinisVARDAS. Rasti tik personažaiį $ IFSyra pripažįstamikaipžodis
skiriamieji ženklai.

Jei nepateikiama jokių pavadinimų, nurodykite eilutęskaitytiyra saugomasįkintamasis REPLY.

Galimybės:
masyvas priskiria žodžiusskaitytiį nuoseklius masyvo indeksus
kintamasis ARRAY, pradedant nuo nulio
-datribotiTęsti ikipirmasis DELIM simbolis yraskaityti, veikiau
nei nauja linija
-eilučiai gauti naudokite „Readline“įinteraktyvus apvalkalas
-inaudoti tekstą TEXTkaippradinį tekstądėlSkaitymo eilutė
-nncharsgrįžtiperskaitę NCHARS simbolius, o ne laukę
dėlnauja eilutė, bet gerbkite ribotuvąjeimažiau nei

NCHARS simboliai yraskaitytiprieš ribotuvą
-Nncharsgrįžtitik perskaičius tiksliai NCHARS simbolius, nebent
Atsiranda EOF arbaskaityti laikaiišeiti, nekreipiant dėmesio
ribotuvas
-praginimas išveskite eilutę PROMPT be galinės naujos eilutės
bandydamasskaityti
-rdarytineleiskite atbulinių brūkšnių išvengti simbolių
-sdarytineišmetėįvestis ateina iš terminalo
-tlaikas baigėsilaikasišeiti irgrįžtinesėkmėjeiįbaigtaseilutė
įvestis nėraskaitytiper TIMEOUT sekundę. Vertė
TMOUT kintamasis yra numatytasis skirtasis laikas. TIMEOUT gali būti a
trupmeninis skaičius. Jei TIMEOUT yra0,skaitytigrįžta
iš karto, nesistengdamasskaitytibet kokie duomenys, grąžinami
tik sėkmėjeiįvestis yra prieinama nurodytam
failądeskriptorius. Theišeitistatusas yra didesnis nei128
jeilaikas yra viršytas
-ufdskaitytinuofailądeskriptorius FD vietoj standartinės įvesties

Išėjimo būsena:
Thegrįžtikodas yra nulis, nebent susiduriama su failo pabaiga,skaityti laikaiišeiti
(į kuris atvejistaiyra didesnis nei 128), kintamojo priskyrimo klaida

Gaunamas vartotojo įvestis

Interaktyvūs „bash“ scenarijai yra niekas, nesulaukus vartotojo įvesties. Skaitymo integruotas numato metodus, kaip vartotojo įvestis gali būti įtraukta į „bash“ scenarijų.

Įvesties eilutės gaudymas

Norint sugauti įvesties eilutę, skaitymo metu nereikia nurodyti VARDŲ ir parinkčių. Kai NAME nenurodytas, kintamasis, pavadintas REPLY, naudojamas vartotojo įvesties saugojimui.



Komandos

{
išmetė -n „Įveskite ką nors ir paspauskite„ Enter “:;
skaityti;
išmetėĮvedėte$ {REPLY}
}

Išvestis

Įveskite kažką ir paspauskite „Enter“: kažkas(nauja linija)
Kažką įvedėte

Gaunamas įvesties žodis

Norint sugauti įvesties žodį, būtina parinktis -d. Žodžio atveju mes nustatytume -d į tarpą, perskaitykime „-d“. Tai yra tada, kai vartotojas paspaudžia tarpo klavišą, nuskaitymas įkelia atsakymą su žodžiu.

Atminkite, kad pasirinkus parinktį -d, grįžimo klavišas neveikia taip, kaip tikėtasi. Norėdami grįžti atgal, bandydami sugauti įvesties žodį, galite naudoti parinktį -e, perskaitykite -e '-d'.

Komandos

{
išmetė -n „Įveskite ką nors ir paspauskite tarpą:“;
skaityti '-d';
išmetė '';
išmetė 'Tu rašei$ {REPLY}'
}

Išvestis

Įveskite kažką ir paspauskite tarpą: kažkas(erdvės)
Kažką įvedėte

Greitas vartotojas

Interaktyviuose „bash“ scenarijuose, raginančiuose vartotoją, gali reikėti pranešimo, kad vartotojas nurodytų, kokio įvesties tikimasi. Mes visada galime tai padaryti naudodami integruotą aidą. Tačiau paaiškėja, kad yra galimybė naudoti skaitymą.

Paprašykite vartotojo žodžio

Paimdami įvesties žodį, naudojome aidą rašydami „Įveskite kažką“ ir paspauskite tarpo klavišą: į standartinę išvestį prieš skaitydami „-d“. Parinktis -p leidžia rodyti pranešimą prieš skaitant iš standartinės įvesties.

Komandos

{
skaityti -p „Įveskite ką nors ir paspauskite tarpą:“ '-d';
išmetė '';
išmetė 'Tu rašei$ {REPLY}'
}

Išvestis

Įveskite kažką ir paspauskite tarpą: kažkas(erdvės)
Kažką įvedėte

Paprašykite vartotojo sužinoti paslaptį

Gaudant vartotojo įvestį, kai jis nerodomas terminale, „-s“ parinktis yra naudinga. skaityti -s -p leidžia sugauti ir paslėpti vartotojo įvestį taip.

Komandos

{
skaityti -s -p „Įveskite ką nors, ką pažadu laikyti paslaptyje:“
išmetė '';
išmetė „Tavo paslaptis saugi pas mane“;nenustatytaATSAKYTI;
išmetė '$ {REPLY}'
}

Išvestis

Įveskite tai, ką žadu laikyti paslaptyje:
Tavo paslaptis saugi pas mane

Funkcijos naudojant skaitymą

Čia pateikiami „bash“ funkcijų, naudojančių skaitymą ir standartinį įvestį, pavyzdžiai

Pagrindinė koncepcija

Skaitymo funkcijos naudoja standartinį įvestį ir parametrus. Pagrindinis apdorojamas įėjimas, pvz., Failo eilutės, perduodamas per standartinį įvestį per vamzdį. Kiti įvestys, jei yra, ir parinktis perduodami kaip parametrai.

skaityti -t 1NAME1 NAME2 ...

skaitytiyrapastatytas komandą

-t 1 neleidžia „bash“ scenarijui neribotą laiką laukti, kol eilutė bus grąžinta naudojant įprastą įvestį. Jei standartinė įvestis iš pradžių tuščia, funkcija grįžta su išėjimo kodu 142, reiškiančiu, kad per nustatytą laiko tarpą nebuvo nuskaityta data

NAME1 NAME2 yra kintamieji pavadinimai

... gali būti išvardyta daug kintamųjų pavadinimų

Dabar, kai pamatai yra nustatyti, pažiūrėkime, kaip atrodo žinomos funkcijos, įdiegtos naudojant skaitymą.

Prisijungimo funkcija naudojant skaitymą

Tarkime, kad norime sujungimo funkcijos, kuri paimtų žodžių sąrašą ir grąžintų kitą žodžių sąrašą, sujungtą su skiriamuoju ženklu. Štai kaip mes galime įdiegti prisijungimo funkciją naudodami skaitymą.

Scenarijus

#!/bin/bash
## prisijunk
## versija 0.0.2 - pataisykite rekursijos parametrus
###############################################
prisijungti() { { vietinisribotuvas;ribotuvas='{1-} USD';vietinisišorinis ribotuvas;
ribotuvas='{2-.} USD';}
vietinisautomobilis
vietiniscdr
vietinisIFS
IFS='$ {indelimiter}'
skaityti -t 1automobilio cdr|| grįžti
testas '$ {cdr}' || { išmetė '$ {car}';grįžti;}
išmetė '$ {car}$ {outdelimiter}$ {cdr}' | $ {FUNCNAME} '$ {indelimiter}'
'$ {outdelimiter}'
}
###############################################
## sukurta create-stub2.sh v0.1.2
## pirmadienį, 2019 m. birželio 17 d. 12:24:59 +0900
## pamatyti
###############################################

Šaltinis: prisijungti.sh
Komandinė eilutė

išmetėa b| prisijungti

Išvestis

a.b

Komandinė eilutė

išmetėa b| prisijungti | prisijungti. |

Išvestis

į|b

Žemėlapio funkcijos naudojant skaitymą

Tarkime, kad norime žemėlapio funkcijos, kuri paimtų sąrašą ir grąžintų kitą sąrašą, kuriame yra tiek pat elementų, kuriuos modifikuoja kita funkcija. Štai kaip mes galime įdiegti žemėlapio funkciją naudodami skaitymą.

Scenarijus

#!/bin/bash
## žemėlapis
## versija 0.0.1 - pradinė
###############################################
žemėlapis() { { vietinisfunkcija_pavadinimas;funkcija_pavadinimas='{1} USD';}
vietinisautomobilis
vietiniscdr
vietinisIFS
IFS='$ {indelimiter-}'
skaityti -t 1automobilio cdr|| grįžti
testas '$ (deklaruoti -f $ {function_name})' || grįžti
testas '$ {car}' || { tiesa;grįžti;}
$ {function_name} $ {car}
išmetė '$ {cdr}' | $ {FUNCNAME} '$ {function_name}'
}
###############################################
## sukurta create-stub2.sh v0.1.2
## antradienį, 2019 m. birželio 18 d. 08:33:49 +0900
## pamatyti
###############################################

Šaltinis: žemėlapis.sh
Komandos

NS() { vietinis -i i={1} USD;išmetė$((i** 2 ));}
išmetė {1..10} |žemėlapis pow

Išvestis

1
4
9
16
25
36
49
64
81
100

Filtravimo funkcija naudojant skaitymą

Tarkime, kad norime filtro funkcijos, kuri paimtų sąrašą ir grąžintų elementų, kurie atitinka kitos funkcijos nustatytas sąlygas, pogrupį. Štai kaip mes galime įdiegti filtravimo funkciją naudodami skaitymą.

Scenarijus

#!/bin/bash
## filtras
## versija 0.0.1 - pradinė
###############################################
filtras() { { vietinisfunkcija_pavadinimas;funkcija_pavadinimas='{1} USD';}
vietinisautomobilis
vietiniscdr
vietinisIFS
IFS='$ {indelimiter-}'
skaityti -t 1automobilio cdr|| grįžti
testas '$ (deklaruoti -f $ {function_name})' || grįžti
testas '$ {car}' || { tiesa;grįžti;}
$ {function_name} '$ {car}' || išmetė -n '$ {car}'
išmetė '$ {cdr}' | $ {FUNCNAME} '$ {function_name}'
}
###############################################
## sukurta create-stub2.sh v0.1.2
## antradienį, 2019 m. birželio 18 d. 13:19:54 +0900
## pamatyti
###############################################

Šaltinis: filtras.sh

Komandos

keista() { vietinis -i i={1} USD;testas !$((i% 2 )) -ekv 1;}
išmetė {1..10} |keistas filtras

Išvestis

1 3 5 7 9

Kilpos naudojant skaitymą

Ciklai, naudojantys skaitymą, leidžia kartoti failo, kuris turi būti sukurtas arba jau yra, eilutes.

Pagrindinė skaitymo kilpa kairėje pusėje (lhs)

Turime komandą ar funkciją (lhs), kuri gali generuoti eilutes faile, kurį galima perjungti naudojant skaitymo ir laiko ciklą.

Konstruoti

lhs| tuo tarpu skaityti
daryti
tiesa
padaryta
lhs yra akomandąkuris grąžina eilučių sąrašą

Komandos

sek 5 | tuo tarpu skaitytii
daryti
išmetė $ {i}
padaryta

Išvestis

1
2
3
4
5

Pagrindinė skaitymo kilpa dešinei pusei (rhs)

Turime failą (rhs) su eilutėmis, kurias galima perkelti naudojant skaitymo ir laiko ciklą.

Konstruoti

tuo tarpu skaityti
daryti
tiesa
padaryta <rhs

rhs yra afailąkuriose yra eilutės

Komandos

sek 5 >rhs
tuo tarpu skaitytii
daryti
išmetė $ {i}
padaryta <rhs

Išvestis

1
2
3
4
5

Pasirinktinis lhs ciklo metu naudojant skaitymą

Turime žodžių srautą, kurį norėtume pakartoti naudodami skaitymą.

Konstruoti

(
IFS=''
lhs| tuo tarpu skaityti
daryti
tiesa
padaryta
)

lhs yra žodžių sąrašas

Komandos

(
IFS=''
išmetė {1..5} | tuo tarpu skaitytii
daryti
išmetė '$ {i}
padaryta
)

Išvestis

1 2 3 4 5

Skaitymas iš bet kurios fd vietoj standartinės įvesties

Skaitymo integruota parinktis, dažnai palikta nepaliesta, yra ta, kuri leidžia jums nurodyti, iš kokio failo aprašymo skaityti, skaityti -u FD. Pagal numatytuosius nustatymus FD laikoma standartine įvestimi.

Pagrindinė koncepcija

Kai atidaromas failas, priskiriami failų aprašai. IO peradresavimas „bash“ leidžia palikti failą atidarytą naudojant konkretų failo aprašą. Mums leidžiama rašyti į failą, skaityti iš jo ir uždaryti, kai baigsime.

_()
{
katė /dev/nulis>myfifo;# tuščias myfifo
vykd 3<myfifo;# atidarykite failą myfifo kaip fd 3
išmetė 'Labas pasauli! - nuo 3 fd >myfifo;# rašyk myfifo
skaityti -u 3;# skaityti eilutę iš fd 3
vykd 3> &-;# uždaryti fd 3
išmetė $ {REPLY} # išvesties eilutė nuskaityta iš fd 3 prieš uždarant
}
_# Labas pasauli! nuo fd 3

Traukinio kūrimas su failų aprašymais ir skaitymas -u FD

Tiesiog savo malonumui nusprendžiau sukurti traukinį su failų aprašymais ir perskaityti -u FD. Prie kiekvieno failo aprašymo rašomas skaičius. Kiekvienas failo aprašas nuskaitomas iš toliau pateikto 1 failo deskriptoriaus ir pridedamas prie savęs.

Komandinė eilutė

muštilinuxhint.com/statyti/test-read-fd.sh traukinys10

Išvestis

inicijuojamas fds ...
inicijuojant fd3...
fd3intializuotas
inicijuojant fd4...
fd4intializuotas
fds intializuotas
skaitymas iš fd3ir4...
4 3
fds prieš valymą
0 1 2 3 4 5
valymas ...
valyti fds ...
padarytavalyti fds
fds po valymo
0 1 2 3

Praleisti funkciją naudojant skaitymą -u FD

Jei bėgate

uname
MINGW64_NT-10.0Stalviršis-XVVVVVV 2.7.0(0.307/5/3)
2017 m.-02-17 14:dvidešimtx86_64 „Msys“
mušti --versija
GNUmušti, 4.4.12 versija(1)-paleisti(x86_64-pc-msys)

gali būti įmanoma dėl klaidos įdiegti praleidimo funkciją, kuri praleidžia šią eilutę bash scenarijuje už funkcijų ribų prieš nuskaitant scenarijaus šaltinį. Atminkite, kad jis neveikia daugumoje sistemų. Pavyzdžiui,

uname
„Linux“ 4.9.0-8-amd64#1 Debian SMP 4.9.144-3.1 (2019-02-19) x86_64 GNU/Linux
mušti --versija
GNUmušti, 4.4.12 versija(1)-paleisti(x86_64-pc-linux-gnu)

skip neskraido.

Funkcija

praleisti() { skaityti -u 31;}

Komandos

praleisti
išmetėeilutė praleista
tiesa

Išvestis

(tuščia)

Esmė

„Bash“ integruotas skaitymas ne tik sugauna vartotojo įvestį. Jis gali būti naudojamas funkcijoms, kilpoms ir mainams tarp failų aprašų, naudojamų „bash“ scenarijuose. Retkarčiais, naudojant skaitymo ir failų aprašus, galima gauti Velykų kiaušinių.