Příkaz pro čtení Bash

Bash Read Command

Čtěte nebo zemřete přátelé. Příkaz ke čtení je stejně důležitý jako poziční parametry a příkaz echo. Jak jinak se chystáte zachytit vstup uživatele, přijímat hesla, zapisovat funkce, smyčku a nakukovat do deskriptorů souborů? Číst dál.

Co se čte?

Read je vestavěný příkaz bash, který čte obsah řádku do proměnné. Umožňuje rozdělení slov, které je vázáno na speciální proměnnou prostředí IFS. Primárně se používá pro zachycení uživatelského vstupu, ale lze jej použít k implementaci funkcí přijímajících vstup ze standardního vstupu.



Bash přečte vestavěnou pomoc s příkazy

Než se ponoříme do používání příkazu read v bash skriptech, zde je nápověda. Tam byste měli vidět všechny možnosti dostupné pro příkaz čtení spolu s popisy, které se pokusíme pokrýt v příkladech.



Příkazový řádek



Pomoc číst

Výstup

číst:číst [-ers] [-pole] [-d podíl] [-text] [-n nchars] [-N nchars]
[-p výzva] [-t časový limit] [-u fd] [název ...]

Přečíst řádek ze standardního vstupu arozdělitto do polí.

Přečte jeden řádek ze standardního vstupu nebo zsoubordeskriptor FD
-lithe-umožnost je dodávána. Linka jerozdělitdo polítak jakose slovem
rozdělení a první slovo je přiřazeno prvnímu JMÉNU, druhému
slovo na druhé JMÉNO atd., přičemž všechna zbylá slova jsou přiřazena
theposledníNÁZEV. Nalezeny pouze postavyv $ IFSjsou uznáványtak jakoslovo
oddělovače.

Pokud nejsou zadána žádná JMÉNA, řádekčístJe uloženvproměnnou REPLY.

Možnosti:
-napole přiřadit slovačístna sekvenční indexy pole
proměnná ARRAY, začínající na nule
-ddelimpokračovat dokudprvní znak DELIM ječíst, spíše
než nový řádek
-e k získání řádku použijte Readlinevinteraktivní shell
-ipoužít text TEXTtak jakopůvodní textproReadline
-nncharsvrátit sepo přečtení znaků NCHARS než čekání
pronový řádek, ale ctít oddělovač-liméně než

NCHARS znaky jsoučístpřed oddělovač
-Nncharsvrátit sepouze po přečtení přesně NCHARS znaků, pokud
EOF se vyskytuje nebočíst krátven, ignorovat všechny
oddělovač
-pprompt výstup řetězce PROMPT bez koncového nového řádku dříve
pokoušet sečíst
-rdělatnedovolte, aby zpětná lomítka unikla jakýmkoli postavám
-sdělatnevyhodilvstup přicházející z terminálu
-tČasový limitčasven avrátit seselhání-linakompletnířada
vstup neníčístdo TIMEOUT sekund. Hodnota
Proměnná TMOUT je výchozí časový limit. TIMEOUT může být a
zlomkové číslo. Pokud je TIMEOUT0,čístvrací
okamžitě, aniž by se o to pokoušelčístjakákoli data, vrácení
jen úspěch-livstup je k dispozici na zadaném
soubordeskriptor. Thevýstupstav je větší než128
-ličasový limit je překročen
-ufdčístzsoubordeskriptor FD místo standardního vstupu

Stav ukončení:
Thevrátit sekód je nula, pokud nenajdete konec souboru,číst krátven
(v který případtoje větší než 128), chyba přiřazení proměnné

Zachycení vstupu uživatele

Interaktivní bash skripty nejsou nic, co by nezachytilo vstup uživatele. Integrovaný modul pro čtení poskytuje metody, které mohou zadávání uživatelů zachytit v rámci skriptu bash.

Chytání řádku vstupu

Chcete -li zachytit řádek vstupních JMÉNA a možnosti nejsou čtením vyžadovány. Pokud NAME není zadán, slouží k ukládání vstupů uživatelů proměnná s názvem REPLY.



Příkazy

{
vyhodil -n 'Napište něco a stiskněte Enter:';
číst;
vyhodilZadal jsi$ {REPLY}
}

Výstup

Napište něco a stiskněte Enter: něco(nový řádek)
Něco jsi zadal

Chytání slova vstupu

Chcete -li zachytit slovo vstupu, je vyžadována volba -d. V případě slova bychom nastavili -d na mezeru, přečtěte si ‚-d‘. To je, když uživatel stiskne mezerník číst načte REPLY se slovem.

Všimněte si, že když je nastavena možnost -d, backspace nefunguje podle očekávání. Chcete -li se vrátit zpět a pokusit se zachytit slovo vstupu, lze použít volbu -e, číst -e ‘-d‘.

Příkazy

{
vyhodil -n 'Napište něco a stiskněte mezerník:';
číst '-d';
vyhodil '';
vyhodil 'Napsal jsi$ {REPLY}'
}

Výstup

Zadejte něco a stiskněte mezerník: něco(prostor)
Něco jsi zadal

Pohotový uživatel

V interaktivních bash skriptech může uživatel vyžadovat zprávu, která uživateli sdělí, jaký vstup se očekává. Toho můžeme vždy dosáhnout pomocí vestavěného echa. Ukazuje se však, že existuje možnost pomocí čtení.

Vyzvat uživatele ke slovu

Když jsme zachytili vstupní slovo, použili jsme echo k napsání něčeho a stisknutí mezery: na standardní výstup před čtením ‘-d’. Volba -p umožňuje zobrazit zprávu před čtením ze standardního vstupu.

Příkazy

{
číst -p 'Napište něco a stiskněte mezerník:' '-d';
vyhodil '';
vyhodil 'Napsal jsi$ {REPLY}'
}

Výstup

Zadejte něco a stiskněte mezerník: něco(prostor)
Něco jsi zadal

Požádat uživatele o tajemství

Při zachycení uživatelského vstupu, aniž by se zobrazoval v terminálu, přijde vhod volba -s. read -s -p vám umožňuje zachytit a skrýt vstup uživatele následujícím způsobem.

Příkazy

{
číst -s -p 'Napište něco, co slibuji, že to udrží v tajnosti:'
vyhodil '';
vyhodil 'Vaše tajemství je u mě v bezpečí';nestabilníODPOVĚĎ ;
vyhodil '$ {REPLY}'
}

Výstup

Napište něco, co slibuji, že to udrží v tajnosti:
Vaše tajemství je u mě v bezpečí

Funkce pomocí čtení

Zde jsou příklady funkcí v bashu, které používají čtení a standardní vstup

Základní koncept

Funkce využívající čtení využívají standardní vstup a parametry v potrubí. Hlavní vstup, který má být zpracován, jako jsou řádky v souboru, jsou předávány standardním vstupem prostřednictvím kanálu. Ostatní parametry if-any a option jsou předávány jako parametry.

číst -t 1NAME1 NAME2 ...

čístjevestavěný příkaz

-t 1 zabrání skriptu bash neomezeně čekat na vrácení řádku přes standardní vstup. Pokud je standardní vstup zpočátku prázdný, funkce se vrátí s výstupním kódem 142, což znamená, že během nastaveného časového limitu nebylo přečteno žádné datum

NAME1 NAME2 jsou názvy proměnných

... může být uvedeno mnoho názvů proměnných

Nyní, když jsou základy vytvořeny, podívejme se, jak vypadají známé funkce implementované pomocí čtení.

Připojte se k funkci pomocí čtení

Předpokládejme, že chceme funkci spojení, která vezme seznam slov a vrátí další seznam slov spojený oddělovačem. Zde je návod, jak můžeme implementovat funkci spojení pomocí čtení.

Skript

#!/bin/bash
## připojit
## verze 0.0.2 - opravit parametry rekurze
############################################################################# #
připojit() { { místníomezovač;omezovač='$ {1-}';místníoutdelimiter;
outdelimiter='{2-.} $';}
místníauto
místnícdr
místníIFS
IFS='$ {indelimiter}'
číst -t 1auto cdr|| vrátit se
test '$ {cdr}' || { vyhodil '$ {auto}';vrátit se;}
vyhodil '$ {auto}$ {outdelimiter}$ {cdr}' | $ {FUNCNAME} '$ {indelimiter}'
'$ {outdelimiter}'
}
############################################################################# #
## generováno create-stub2.sh v0.1.2
## v pondělí, 17. června 2019 12:24:59 +0900
## viz
############################################################################# #

Zdroj: připojit se.sh
Příkazový řádek

vyhodila b| připojit

Výstup

a.b

Příkazový řádek

vyhodila b| připojit | připojit. |

Výstup

na|b

Funkce map pomocí čtení

Předpokládejme, že chceme funkci mapy, která vezme seznam a vrátí další seznam obsahující stejný počet prvků, které jsou upraveny jinou funkcí. Zde je návod, jak můžeme implementovat funkci mapy pomocí čtení.

Skript

#!/bin/bash
## mapa
## verze 0.0.1 - počáteční
############################################################################# #
mapa() { { místnínázev_funkce;název_funkce='$ {1}';}
místníauto
místnícdr
místníIFS
IFS='$ {indelimiter-}'
číst -t 1auto cdr|| vrátit se
test '$ (deklarace -f $ {název_funkce})' || vrátit se
test '$ {auto}' || { skutečný;vrátit se;}
$ {název_funkce} $ {auto}
vyhodil '$ {cdr}' | $ {FUNCNAME} '$ {název_funkce}'
}
############################################################################# #
## generováno create-stub2.sh v0.1.2
## v úterý, 18. června 2019 08:33:49 +0900
## viz
############################################################################# #

Zdroj: map.sh
Příkazy

NS() { místní -i =$ {1};vyhodil$((** 2 ));}
vyhodil {1..10} |mapa pow

Výstup

1
4
9
16
25
36
49
64
81
100

Funkce filtrování pomocí čtení

Předpokládejme, že chceme funkci filtru, která přebírá seznam a vrací podseznam prvků uspokojujících podmínky stanovené jinou funkcí. Zde je návod, jak můžeme implementovat funkci filtru pomocí čtení.

Skript

#!/bin/bash
## filtr
## verze 0.0.1 - počáteční
############################################################################# #
filtr() { { místnínázev_funkce;název_funkce='$ {1}';}
místníauto
místnícdr
místníIFS
IFS='$ {indelimiter-}'
číst -t 1auto cdr|| vrátit se
test '$ (deklarace -f $ {název_funkce})' || vrátit se
test '$ {auto}' || { skutečný;vrátit se;}
$ {název_funkce} '$ {auto}' || vyhodil -n '$ {auto}'
vyhodil '$ {cdr}' | $ {FUNCNAME} '$ {název_funkce}'
}
############################################################################# #
## generováno create-stub2.sh v0.1.2
## v úterý, 18. června 2019 13:19:54 +0900
## viz
############################################################################# #

Zdroj: filtr.sh

Příkazy

zvláštní() { místní -i =$ {1};test !$((% 2 )) -ekv 1;}
vyhodil {1..10} |filtr lichý

Výstup

1 3 5 7 9

Smyčky pomocí čtení

Smyčky využívající čtení vám umožňují iterovat řádky souboru, který má být generován nebo již existuje.

Základní smyčka při čtení pro levou stranu (lhs)

Máme příkaz nebo funkci (lhs), která může generovat řádky v souboru, které lze procházet pomocí smyčky read a while.

Postavit

lhs| zatímco číst
dělat
skutečný
Hotovo
lhs je apříkazvrací seznam řádků

Příkazy

následující 5 | zatímco číst
dělat
vyhodil $ {i}
Hotovo

Výstup

1
2
3
4
5

Základní smyčka při čtení pro pravou stranu (rhs)

Máme soubor (rhs) s řádky, které lze procházet smyčkou read a while.

Postavit

zatímco číst
dělat
skutečný
Hotovo <rhs

rhs je asouborobsahující řádky

Příkazy

následující 5 >rhs
zatímco číst
dělat
vyhodil $ {i}
Hotovo <rhs

Výstup

1
2
3
4
5

Vlastní lhs při smyčce pomocí čtení

Máme proud slov, které bychom chtěli procházet pomocí čtení.

Postavit

(
IFS=''
lhs| zatímco číst
dělat
skutečný
Hotovo
)

lhs je seznam slov

Příkazy

(
IFS=''
vyhodil {1..5} | zatímco číst
dělat
vyhodil '$ {i}
Hotovo
)

Výstup

1 2 3 4 5

Čtení z libovolného fd namísto standardního vstupu

Volba vestavěné pro čtení, která často zůstává nedotčena, vám umožní určit, z jakého deskriptoru souboru chcete číst, číst -u FD. Standardně je FD považován za standardní vstup.

Základní koncept

Když je otevřený soubor přiřazen deskriptorům souboru. Přesměrování IO v bash umožňuje ponechat soubor otevřený s konkrétním deskriptorem souboru. Je dovoleno do souboru zapisovat, číst z něj a zavřít jej, až budeme hotovi.

_()
{
kočka /dev/nula>myfifo;# prázdné myfifo
vykon 3<myfifo;# otevřete soubor myfifo jako fd 3
vyhodil 'Ahoj světe! - od fd 3 ' >myfifo;# napište na myfifo
číst -u 3;# číst řádek z fd 3
vykon 3> &-;# zavřít fd 3
vyhodil $ {REPLY} # výstupní řádek načten z fd 3 před zavřením
}
_# Ahoj světe! od fd 3

Sestavení vlaku pomocí deskriptorů souborů a čtení -u FD

Jen pro zajímavost jsem se rozhodl postavit vlak s deskriptory souborů a číst -u FD. Ke každému deskriptoru souboru je zapsáno číslo. Každý deskriptor souboru čte z deskriptoru souboru 1 níže a připojí se k sobě.

Příkazový řádek

bashlinuxhint.com/stavět/test-read-fd.sh vlak10

Výstup

inicializace FDS ...
inicializace fd3...
fd3inicializováno
inicializace fd4...
fd4inicializováno
fds inicializováno
čtení z fd3a4...
4 3
fds před čištěním
0 1 2 3 4 5
čištění ...
úklid fds ...
Hotovoúklid fds
fds po vyčištění
0 1 2 3

Přeskočit funkci pomocí read -u FD

Pokud běžíte

uname -na
MINGW64_NT-10.0DESKTOP-XVVVVVV 2.7.0(0,307/5/3)
2017-02-17 14:dvacetx86_64 Msys
bash --verze
GNUbash, verze 4.4.12(1)-uvolnění(x86_64-pc-msys)

může být možné kvůli chybě implementovat funkci přeskočení, která přeskočí následující řádek ve skriptu bash mimo funkce před čtením zdroje skriptu. Všimněte si, že to nefunguje na většině systémů. Například,

uname -na
Linux 4.9.0-8-amd64#1 Debian SMP 4.9.144-3.1 (2019-02-19) x86_64 GNU/Linux
bash --verze
GNUbash, verze 4.4.12(1)-uvolnění(x86_64-pc-linux-gnu)

skip neletí.

Funkce

přeskočit() { číst -u 31;}

Příkazy

přeskočit
vyhodilřádek přeskočen
skutečný

Výstup

(prázdný)

Sečteno a podtrženo

Čtení vestavěné v bash dělá více než jen zachycení vstupu uživatele. Může být použit ve funkcích, smyčkách a výměnách mezi deskriptory souborů používanými v bash skriptech. Z průzkumu pomocí deskriptorů čtení a souborů může někdy vzniknout velikonoční vajíčko.