Bash príkaz na čítanie

Bash Read Command



Čítajte alebo zomrite priatelia. Príkaz read je rovnako dôležitý ako polohové parametre a príkaz echo. Ako inak sa chystáte zachytiť vstup používateľov, prijímať heslá, písať funkcie, vytvárať slučky a nahliadať do deskriptorov súborov? Pokračuj v čítaní.

Č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 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

zahodila b| pridať sa

Výkon

a.b

Príkazový riadok

zahodila b| pridať sa | pridať sa. |

Výkon

do|b

Mapové 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

NS() { miestny -i i={1} $;zahodil$((i** 2 ));}
zahodil {1..10} |map pow

Výkon

1
4
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 9

Sluč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ťi
urobiť
zahodil $ {i}
hotový

Výkon

1
2
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 >rhs
ký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 vlak10

Vý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 -do
MINGW64_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 -do
Linux 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.