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
Výstup
a.bPříkazový řádek
vyhodila b| připojit | připojit. |Výstup
na|bFunkce 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
vyhodil {1..10} |mapa pow
Výstup
14
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 já=$ {1};test !$((já% 2 )) -ekv 1;}vyhodil {1..10} |filtr lichý
Výstup
1 3 5 7 9Smyč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.
Postavitlhs| zatímco číst
dělat
skutečný
Hotovo
lhs je apříkazvrací seznam řádků
Příkazy
následující 5 | zatímco čístjádělat
vyhodil $ {i}
Hotovo
Výstup
12
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.
Postavitzatímco číst
dělat
skutečný
Hotovo <rhs
rhs je asouborobsahující řádky
Příkazy
následující 5 >rhszatímco čístjá
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 čístjá
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 vlak10Vý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 -naMINGW64_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 -naLinux 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čitvyhodilřá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.