Čo sa číta?
Read je zabudovaný príkaz bash, ktorý načíta obsah riadka do premennej. Umožňuje rozdelenie slov, ktoré je viazané na špeciálnu shell premennú IFS. Primárne sa používa na zachytávanie používateľských vstupov, ale môže sa použiť na implementáciu funkcií prijímajúcich vstup zo štandardného vstupu.
Bash si prečítajte vstavaný príkazový riadok
Predtým, ako sa ponoríme do toho, ako používať príkaz read v skriptoch bash, získate pomoc. Tam by ste mali vidieť všetky možnosti dostupné pre príkaz na čítanie spolu s popismi, ktoré sa pokúsime pokryť v príkladoch.
Príkazový riadok
Pomoc čítať
Výkon
čítať:čítať [-ers] [-pole] [-d podiel] [-text] [-n nchars] [-N nchars]
[-p výzva] [-t časový limit] [-u fd] [názov ...]
Prečítajte si riadok zo štandardného vstupu arozdeliťto do polí.
Načíta jeden riadok zo štandardného vstupu alebo zsúbordeskriptor FD
kebythe-uje dodávaná možnosť. Riadok jerozdeliťdo políakoso slovom
rozdelením a prvé slovo je priradené prvému MENU, druhému
slovo druhému NAME a podobne, pričom všetky zvyšné slová sú priradené k
theposlednýNÁZOV. Našli sa iba postavyv $ IFSsú uznávanéakoslovo
oddeľovače.
Ak nie sú zadané žiadne NÁZVY, riadokčítaťje uloženývpremenná REPLY.
Možnosti:
-dopole priradiť slováčítaťna sekvenčné indexy poľa
premenná ARRAY, začínajúca na nule
-ddelimďalej ažprvý znak DELIM ječítať, skôr
než nový riadok
-Na získanie riadka použijeme Readlinevinteraktívny shell
-ipoužiť text TEXTakopočiatočný textpreČiara na čítanie
-nncharsvrátiť sapo prečítaní znakov NCHARS namiesto čakania
prenový riadok, ale cti oddeľovačkebymenej ako
Počet znakov je NCHARSčítaťpred oddeľovačom
-Nncharsvrátiť saiba po prečítaní presne NCHARS znakov, pokiaľ
EOF sa vyskytuje respčítať krátvon, ignorujúc akékoľvek
oddeľovač
-pprompt vygenerujte reťazec PROMPT bez koncového nového riadku
pokúšajúci sačítať
-rurobiťnedovoľte, aby spätné lomítka unikli akýmkoľvek znakom
-surobiťniezahodilvstup prichádzajúci z terminálu
-tčas vypršalčasvon avrátiť sazlyhaniekebydoúplnériadok z
vstup nie ječítaťdo TIMEOUT s. Hodnota súboru
Premenná TMOUT je predvolený časový limit. TIMEOUT môže byť a
zlomkové číslo. Ak je TIMEOUT0,čítaťvracia
okamžite, bez toho, aby ste sa o to pokúšaličítaťakékoľvek údaje, vrátenie
iba úspechkebyvstup je k dispozícii na zadanom
súbordeskriptor. Thevýchodstav je vyšší ako128
kebyčasový limit je prekročený
-ufdčítaťodsúbordeskriptor FD namiesto štandardného vstupu
Stav výstupu:
Thevrátiť sakód je nula, pokiaľ nenarazíte na koniec súboru,čítať krátvon
(v ktoré prípadtoje väčšia ako 128), chyba priradenia premennej
Zachytenie vstupu používateľa
Interaktívne skripty bash nie sú ničím, bez toho, aby museli zachytávať vstupy používateľov. Vstavaný systém na čítanie poskytuje metódy, pomocou ktorých môže byť vstup užívateľa zachytený v skriptu bash.
Zachytenie riadka vstupu
Na zachytenie riadka vstupu NAME a možnosti nevyžadujú čítanie. Ak nie je zadané NAME, na ukladanie vstupov používateľov sa používa premenná s názvom REPLY.
Príkazy
{zahodil -n „Napíšte niečo a stlačte kláves Enter:“;
čítať;
zahodilZadali ste$ {REPLY}
}
Výkon
Napíšte niečo a stlačte kláves Enter: niečo(Nový riadok)Nieco si napisal
Chytenie slova vstupu
Na zachytenie vstupného slova je potrebná voľba -d. V prípade slova by sme nastavili -d na medzeru, čítame '-d'. To je, keď užívateľ stlačí medzerník čítať načítať REPLY so slovom.
Všimnite si toho, že keď je nastavená možnosť -d, backspace nefunguje podľa očakávania. Na návrat späť, keď sa pokúšate zachytiť vstupné slovo, môžete použiť voľbu -e, čítať -e '-d'.
Príkazy
zahodil -n „Napíšte niečo a kliknite na medzerník:“;
čítať '-d';
zahodil '';
zahodil 'Napísal si$ {REPLY}'
}
Výkon
Napíšte niečo a stlačte medzerník: niečo(priestor)Nieco si napisal
Pohotový používateľ
V interaktívnych skriptoch bash, ktoré vyzývajú používateľa, môže používateľ požadovať správu, ktorá mu oznámi, aký vstup sa očakáva. Vždy to môžeme dosiahnuť pomocou zabudovanej ozveny. Ukazuje sa však, že existuje možnosť používať čítanie.
Vyzvať používateľa na slovo
Na zachytenie vstupného slova sme použili echo na napísanie niečoho a stlačenie medzery: na štandardný výstup pred čítaním „-d“. Voľba -p umožňuje zobrazenie správy pred čítaním zo štandardného vstupu.
Príkazy
{čítať -p „Napíšte niečo a kliknite na medzerník:“ '-d';
zahodil '';
zahodil 'Napísal si$ {REPLY}'
}
Výkon
Napíšte niečo a stlačte medzerník: niečo(priestor)Nieco si napisal
Požiadať používateľa o poskytnutie tajomstva
Pri zachytávaní vstupu používateľa bez toho, aby sa zobrazoval v termináli, príde vhod voľba -s. read -s -p vám umožňuje zachytiť a skryť vstup používateľa nasledujúcim spôsobom.
Príkazy
{čítať -s -p „Napíšte niečo, čo sľubujem, že to utajím:“
zahodil '';
zahodil „Tvoje tajomstvo je u mňa v bezpečí“;rozrušenýODPOVEĎ;
zahodil '$ {REPLY}'
}
Výkon
Napíšte niečo, čo sľubujem, že to udrží v tajnosti:Vaše tajomstvo je u mňa v bezpečí
Funkcie pomocou čítania
Tu sú príklady funkcií v bash, ktoré používajú čítanie a štandardný vstup
Základný koncept
Funkcie využívajúce čítanie využívajú štandardný vstup a parametre v potrubí. Hlavný vstupný signál, ktorý sa má spracovať, ako napríklad riadky v súbore, sa odovzdáva cez štandardný vstup prostredníctvom potrubia. Ďalší parameter if-any a option sa odovzdáva ako parametre.
čítať -t 1NAME1 NAME2 ...čítaťje avstavaný príkaz
-t 1 zabráni skriptu bash neobmedzenému čakaniu na vrátenie riadka prostredníctvom štandardného vstupu. Ak je štandardný vstup spočiatku prázdny, funkcia sa vráti s výstupným kódom 142, čo znamená, že v nastavenom časovom limite nebol prečítaný žiadny dátum.
NAME1 NAME2 sú názvy premenných... môže byť uvedených mnoho názvov premenných
Teraz, keď sú základy pripravené, pozrime sa, ako vyzerajú známe funkcie implementované pomocou čítania.
Pripojte sa k funkcii pomocou čítania
Predpokladajme, že chceme funkciu spojenia, ktorá vezme zoznam slov a vráti ďalší zoznam slov spojených oddeľovačom. Tu je návod, ako môžeme implementovať funkciu spojenia pomocou čítania.
Skript#!/bin/bash
## Pripojte sa
## verzia 0.0.2 - oprava parametrov rekurzie
######################################################################################################################################################################### #
pridať sa() { { miestnyobmedzovač;obmedzovač='{1} $';miestnyoutdelimiter;
outdelimiter='{2-.} $';}
miestnyauto
miestnycdr
miestnyIFS
IFS='$ {indelimiter}'
čítať -t 1auto cdr|| vrátiť sa
test '$ {cdr}' || { zahodil '$ {auto}';vrátiť sa;}
zahodil '$ {auto}$ {outdelimiter}$ {cdr}' | $ {FUNCNAME} '$ {indelimiter}'
'$ {outdelimiter}'
}
######################################################################################################################################################################### #
## vygenerované pomocou create-stub2.sh v0.1.2
## v pondelok, 17. júna 2019 12:24:59 +0900
## pozri
######################################################################################################################################################################### #
Zdroj: join.sh
Príkazový riadok
Výkon
a.bPríkazový riadok
zahodila b| pridať sa | pridať sa. |Výkon
do|bMapové funkcie pomocou čítania
Predpokladajme, že chceme funkciu mapy, ktorá vezme zoznam a vráti ďalší zoznam obsahujúci rovnaký počet prvkov, ktoré sú upravené inou funkciou. Tu je návod, ako môžeme implementovať funkciu mapy pomocou čítania.
Skript#!/bin/bash
## mapa
## verzia 0.0.1 - počiatočná
######################################################################################################################################################################### #
mapu() { { miestnynázov_funkcie;názov_funkcie='{1} $';}
miestnyauto
miestnycdr
miestnyIFS
IFS='$ {indelimiter-}'
čítať -t 1auto cdr|| vrátiť sa
test '$ (deklarujte -f $ {function_name})' || vrátiť sa
test '$ {auto}' || { pravda;vrátiť sa;}
$ {function_name} $ {auto}
zahodil '$ {cdr}' | $ {FUNCNAME} '$ {function_name}'
}
######################################################################################################################################################################### #
## vygenerované pomocou create-stub2.sh v0.1.2
## v utorok, 18. júna 2019 08:33:49 +0900
## pozri
######################################################################################################################################################################### #
Zdroj: map.sh
Príkazy
zahodil {1..10} |map pow
Výkon
14
9
16
25
36
49
64
81
100
Funkcia filtra pomocou čítania
Predpokladajme, že chceme funkciu filtra, ktorá vezme zoznam a vráti podzoznam prvkov uspokojujúcich podmienky stanovené inou funkciou. Tu je návod, ako môžeme implementovať funkciu filtra pomocou čítania.
Skript#!/bin/bash
## filter
## verzia 0.0.1 - počiatočná
######################################################################################################################################################################### #
filter() { { miestnynázov_funkcie;názov_funkcie='{1} $';}
miestnyauto
miestnycdr
miestnyIFS
IFS='$ {indelimiter-}'
čítať -t 1auto cdr|| vrátiť sa
test '$ (deklarujte -f $ {function_name})' || vrátiť sa
test '$ {auto}' || { pravda;vrátiť sa;}
$ {function_name} '$ {auto}' || zahodil -n '$ {auto}'
zahodil '$ {cdr}' | $ {FUNCNAME} '$ {function_name}'
}
######################################################################################################################################################################### #
## vygenerované pomocou create-stub2.sh v0.1.2
## v utorok, 18. júna 2019 13:19:54 +0900
## pozri
######################################################################################################################################################################### #
Zdroj: filter.sh
Príkazy
zvláštny() { miestny -i i={1} $;test !$((i% 2 )) -ekv 1;}zahodil {1..10} |filter nepárny
Výkon
1 3 5 7 9Slučky pomocou čítania
Smyčky používajúce čítanie vám umožňujú iterovať riadky súboru, ktorý sa má vygenerovať alebo už existuje.
Základná slučka pri čítaní pre ľavú stranu (lhs)
Máme príkaz alebo funkciu (lhs), ktoré môžu generovať riadky v súbore, ktoré je možné opakovať pomocou slučky read a while.
Konštruovaťlhs| kým čítať
urobiť
pravda
hotový
lhs je apríkazčím sa vráti zoznam riadkov
Príkazy
nasl 5 | kým čítaťiurobiť
zahodil $ {i}
hotový
Výkon
12
3
4
5
Základná slučka pri čítaní na pravej strane (rhs)
Máme súbor (rhs) s riadkami, ktoré je možné opakovať pomocou slučky read a while.
Konštruovaťkým čítať
urobiť
pravda
hotový <rhs
rhs je asúborobsahujúce riadky
Príkazy
nasl 5 >rhským čítaťi
urobiť
zahodil $ {i}
hotový <rhs
Výkon
1
2
3
4
5
Vlastné lhs počas cyklu pomocou čítania
Máme prúd slov, ktoré by sme chceli previesť pomocou čítania.
Konštruovať(
IFS=''
lhs| kým čítať
urobiť
pravda
hotový
)
lhs je zoznam slov
Príkazy
(IFS=''
zahodil {1..5} | kým čítaťi
urobiť
zahodil '$ {i}
hotový
)
Výkon
1 2 3 4 5Čítanie z akéhokoľvek fd namiesto štandardného vstupu
Vstavaná možnosť čítania, ktorá je často ponechaná nedotknutá, vám umožní určiť, z akého deskriptora súboru chcete čítať, čítať -u FD. Štandardne je FD považovaný za štandardný vstup.
Základný koncept
Keď je otvorený súbor, sú priradené deskriptory súboru. Presmerovanie IO v bash umožňuje ponechať súbor otvorený s konkrétnym deskriptorom súborov. Môžeme do súboru zapísať, čítať z neho a po dokončení ho zatvoriť.
_(){
kat /dev/nulový>myfifo;# prázdne myfifo
exekútor 3<myfifo;# otvorený súbor myfifo ako fd 3
zahodil „Ahoj, svet! - od fd 3 ' >myfifo;# napíšte myfifo
čítať -u 3;# čítať riadok z fd 3
exekútor 3> &-;# close fd 3
zahodil $ {REPLY} # výstupný riadok prečítaný z fd 3 pred zatvorením
}
_# Ahoj, svet! od fd 3
Zostavenie vlaku so deskriptormi súborov a čítaním -u FD
Len pre zaujímavosť som sa rozhodol postaviť vlak s deskriptormi súborov a čítať -u FD. Ku každému deskriptoru súboru je zapísané číslo. Každý deskriptor súborov číta z nižšie uvedeného deskriptora súborov 1 a pripája sa k sebe.
Príkazový riadok
bashlinuxhint.com/stavať/test-read-fd.sh vlak10Výkon
inicializácia fds ...inicializácia fd3...
fd3zinicializovaný
inicializácia fd4...
fd4zinicializovaný
fds inicializované
čítanie z fd3a4...
4 3
fds pred upratovaním
0 1 2 3 4 5
čistenie ...
upratovanie fds ...
hotovýupratovanie fds
fds po vyčistení
0 1 2 3
Preskočiť funkciu pomocou read -u FD
Ak bežíte
uname -doMINGW64_NT-10.0DESKTOP-XVVVVVV 2.7.0(0,307/5/3)
2017-02-17 14:dvadsaťx86_64 Msys
bash --verzia
GNUbash, verzia 4.4.12(1)-pustiť(x86_64-pc-msys)
kvôli chybe je možné implementovať funkciu preskočenia, ktorá v bash skripte preskočí nasledujúci riadok mimo funkcií pred čítaním zdroja skriptu. Všimnite si toho, že to nefunguje na väčšine systémov. Napríklad,
uname -doLinux 4.9.0-8-amd64#1 Debian SMP 4.9.144-3.1 (2019-02-19) x86_64 GNU/Linux
bash --verzia
GNUbash, verzia 4.4.12(1)-pustiť(x86_64-pc-linux-gnu)
preskočiť neletí.
Funkcia
preskočiť() { čítať -u 31;}
Príkazy
preskočiťzahodilriadok preskočený
pravda
Výkon
(prázdny)Spodná čiara
Čítanie vstavané v bashe viac ako zachytáva vstupy používateľov. Môže byť použitý vo funkciách, slučkách a výmenách medzi deskriptormi súborov použitými v bash skriptoch. Veľkonočné vajíčka môže občas priniesť prieskum pomocou deskriptorov čítania a súboru.