Ano ang binasa?
Basahin ang isang bash builtin na utos na binabasa ang mga nilalaman ng isang linya sa isang variable. Pinapayagan nito ang paghahati ng salita na nakatali sa espesyal na variable ng shell na IFS. Pangunahin itong ginagamit para sa pansing input ng gumagamit ngunit maaaring magamit upang ipatupad ang mga pagpapaandar na kumukuha ng input mula sa karaniwang input.
Basahin ang tulong sa built-in na utos ng utos
Bago kami sumisid sa kung paano gamitin ang read command sa bash script, narito kung paano kami makakakuha ng tulong. Doon dapat mong makita ang lahat ng mga pagpipilian na magagamit para sa nabasa na utos kasama ang mga paglalarawan na susubukan naming saklawin sa mga halimbawa.
Linya ng utos
tulungan basahin
Paglabas
basahin:basahin [-ers] [-ang array] [-d magbahagi] [-i text] [-n nchars] [-N nchars]
[-p prompt] [-t timeout] [-u taut] [pangalan ...]
Basahin ang isang linya mula sa karaniwang input atnahatiito sa bukirin.
Nagbabasa ng isang solong linya mula sa karaniwang input, o mula safiletagapaglarawan FD
kungang-uang pagpipilian ay ibinibigay. Ang linya aynahatisa bukirinbilangmay salita
paghahati, at ang unang salita ay nakatalaga sa unang PANGALAN, ang pangalawa
salita sa pangalawang PANGALAN, at iba pa, na may anumang natitirang mga salita na nakatalaga sa
anghulingPANGALAN Ang mga character lang ang natagpuansa $ IFSay kinikilalabilangsalita
mga delimiter.
Kung walang ibinigay na NAME, ang linyabasahinay nakaimbaksaang variable na REPLY.
Mga Pagpipilian:
-saitalaga ang mga salitabasahinsa sunud-sunod na mga indeks ng array
variable ARRAY, simula sa zero
-ddelimmagpatuloy hanggang saang unang karakter ng DELIM aybasahin, sa halip
kaysa sa newline
-e Gumagamit ng Readline upang makuha ang linyasaisang interactive shell
-akotext use TEXTbilangang paunang tekstopara saBasahin ang linya
-nncharsbumalik kapagkatapos basahin ang mga character na NCHARS kaysa maghintay
para saisang bagong linya, ngunit igalang ang isang delimiterkungmas kaunti sa
Ang mga character na NCHARS aybasahinbago ang delimiter
-Nncharsbumalik kapagkatapos lamang basahin nang eksakto ang mga character na NCHARS, maliban kung
Nakasalubong ang EOF obasahin mga oraslabas, hindi pinapansin
delimiter
-pprompt output ang string PROMPT nang walang isang sumusunod na newline bago
tinatangka nabasahin
-rgawinhindi pinapayagan ang mga backslashes upang makatakas sa anumang mga character
-sgawinhindiitinaponinput na nagmumula sa isang terminal
-tpag-timeoutoraslabas atbumalik kapagkabigokungsakumpletolinya ng
ang input ay hindibasahinsa loob ng TIMEOUT segundo. Ang halaga ng
Ang variable ng TMOUT ay ang default na pag-timeout. TIMEOUT ay maaaring isang
numero ng praksyonal. Kung TIMEOUT ay0,basahinnagbabalik
kaagad, nang hindi sinusubukanbasahinanumang data, nagbabalik
tagumpay langkungmagagamit ang input sa tinukoy
filetagapaglarawan. Anglabasanang katayuan ay mas malaki kaysa sa128
kungang timeout ay lumampas
-utautbasahinmula safiletagapaglaraw FD sa halip na ang karaniwang input
Kalagayan ng Exit:
Angbumalik kaang code ay zero, maliban kung ang end-of-file ay nakasalubong,basahin mga oraspalabas
(sa alin kasoitomas malaki kaysa sa 128), isang variable na err err
Nakakahuli ng input ng gumagamit
Ang mga interactive na bash script ay wala kahit na nahuhuli ang pag-input ng gumagamit. Ang nabasang builtin ay nagbibigay ng mga pamamaraan na ang pag-input ng gumagamit ay maaaring mahuli sa loob ng isang bash script.
Nakakahuli ng isang linya ng pag-input
Upang mahuli ang isang linya ng mga input na NAME at ang mga pagpipilian ay hindi kinakailangan ng binasa. Kapag hindi tinukoy ang NAME, isang variable na nagngangalang REPLY ang ginagamit upang mag-imbak ng input ng gumagamit.
Utos
{itinapon -n 'Mag-type ng isang bagay at pindutin ang enter:';
basahin;
itinaponNag-type ka$ {REPLY}
}
Paglabas
Mag-type ng isang bagay at pindutin ang enter: isang bagay(bagong linya)May nai-type ka
Nakakahuli ng isang salita ng pag-input
Upang mahuli ang isang salita ng pag-input, kinakailangan ang pagpipiliang -d. Sa kaso ng isang salita na itatakda namin -d sa isang puwang, basahin ang '-d'. Iyon ay kapag pinindot ng gumagamit ang space bar na nabasa ay mai-load ang REPLY sa salita.
Tandaan na kapag ang pagpipilian na -d ay itinakda, ang backspace ay hindi gagana tulad ng inaasahan. Upang i-backspace, habang sinusubukang mahuli ang isang salita ng pag-input, maaaring magamit ang -e na pagpipilian, basahin ang -e ā-dā.
Utos
itinapon -n 'Mag-type ng isang bagay at pindutin ang puwang:';
basahin '-d';
itinapon ';
itinapon 'Nag-type ka$ {REPLY}'
}
Paglabas
Mag-type ng isang bagay at pindutin ang puwang: isang bagay(space)May nai-type ka
Mabilis na gumagamit
Sa interactive na mga script ng bash na humihikayat sa isang gumagamit ay maaaring mangailangan ng isang mensahe upang sabihin sa gumagamit kung ano ang inaasahan na pag-input. Palagi nating magagawa ito gamit ang echo builtin. Gayunpaman, lumalabas na mayroong isang pagpipilian gamit ang pagbabasa.
Mabilis na gumagamit para sa isang salita
Sa paghuli ng isang salita ng pag-input, ginamit namin ang echo upang isulat ang Mag-type ng isang bagay at pindutin ang puwang: sa karaniwang output bago basahin ang ā-dā. Pinapayagan ng pagpipiliang -p na ipakita ang isang mensahe bago basahin mula sa karaniwang pag-input.
Utos
{basahin -p 'Mag-type ng isang bagay at pindutin ang puwang:' '-d';
itinapon ';
itinapon 'Nag-type ka$ {REPLY}'
}
Paglabas
Mag-type ng isang bagay at pindutin ang puwang: isang bagay(space)May nai-type ka
Agad na gumagamit para sa isang lihim
Kapag nakahahalina ng input ng gumagamit nang hindi ito nagpapakita ng terminal, ang pagpipilian na -s ay madaling gamiting. Binibigyang-daan ka ng read -s -p na mahuli at itago ang pag-input ng gumagamit tulad ng sumusunod.
Utos
{basahin -s -p 'Mag-type ng isang bagay na ipinapangako kong ililihim ko ito:'
itinapon ';
itinapon 'Ang lihim mo ay ligtas sa akin';i-unsetREPLY;
itinapon '$ {REPLY}'
}
Paglabas
Mag-type ng isang bagay na ipinapangako kong ililihim ito:Ang lihim mo ay ligtas sa akin
Mga pagpapaandar gamit ang nabasa
Narito ang mga halimbawa ng mga pagpapaandar sa bash na gumagamit ng nabasa at karaniwang input
Pangunahing konsepto
Ang mga pag-andar gamit ang read read ay gumagamit ng piped standard input at mga parameter. Pangunahing input upang maging proseso tulad ng mga linya sa isang file ay ipinapasa sa pamamagitan ng karaniwang input sa pamamagitan ng isang tubo. Ang iba pang input kung-mayroon at pagpipilian ay naipasa bilang mga parameter.
basahin -t 1NAME1 NAME2 ...basahinay isangbuiltin utos
-t 1 pigilan ang bash script mula sa paghihintay nang walang katiyakan para sa isang linya na maibalik sa pamamagitan ng karaniwang input. Kung ang karaniwang input ay una nang walang laman, ang function ay bumalik na may isang exit code na 142 na nagpapahiwatig na walang petsa na nabasa sa loob ng itinakdang tagal ng oras ng pag-timeout
Ang NAME1 NAME2 ay mga variable na pangalan... maraming mga pangalan ng variable ay maaaring nakalista
Ngayon na itinakda ang mga batayan, tingnan natin kung ano ang pamilyar na mga pagpapaandar tulad ng ipinatupad gamit ang nabasa.
Sumali sa pagpapaandar gamit ang nabasa
Ipagpalagay na nais natin ang isang function na sumali na kumukuha ng isang listahan ng mga salita at nagbabalik ng isa pang listahan ng mga salitang sinalihan ng isang delimiter. Narito kung paano namin maaaring ipatupad ang isang function na sumali gamit ang pagbasa.
Script#! / baseng / bash
## sumali
## bersyon 0.0.2 - ayusin ang mga parameter ng recursion
###Oooooooooooooooo
sumali ka() { { lokallimiter;limiter='$ {1-}';lokaloutdelimiter;
outdelimiter='$ {2-.}';}
lokalkotse
lokalcdr
lokalIFS
IFS='$ {indelimiter}'
basahin -t 1kotse cdr|| bumalik ka
pagsusulit '$ {cdr}' || { itinapon '$ {car}';bumalik ka;}
itinapon '$ {car}$ {outdelimiter}$ {cdr}' | $ {FUNCNAME} '$ {indelimiter}'
'$ {outdelimiter}'
}
###Oooooooooooooooo
## nabuo ng create-stub2.sh v0.1.2
## sa Lun, 17 Hun 2019 12:24:59 +0900
## tingnan mo
###Oooooooooooooooo
Pinagmulan: sumali.sh
Linya ng utos
Paglabas
a.bLinya ng utos
itinaponisang b| sumali ka | sumali ka. |Paglabas
sa|bMga pagpapaandar sa mapa gamit ang nabasa
Ipagpalagay na nais natin ang isang pagpapaandar sa mapa na kumukuha ng isang listahan at nagbabalik ng isa pang listahan na naglalaman ng parehong bilang ng mga elemento na binago ng isa pang pagpapaandar. Narito kung paano namin maaaring ipatupad ang isang pagpapaandar ng mapa gamit ang pagbasa.
Script#! / baseng / bash
## mapa
## bersyon 0.0.1 - pauna
###Oooooooooooooooo
mapa() { { lokalfunction_name;function_name='$ {1}';}
lokalkotse
lokalcdr
lokalIFS
IFS='$ {indelimiter-}'
basahin -t 1kotse cdr|| bumalik ka
pagsusulit '$ (ideklara -f $ {function_name})' || bumalik ka
pagsusulit '$ {car}' || { totoo;bumalik ka;}
$ {function_name} $ {car}
itinapon '$ {cdr}' | $ {FUNCNAME} '$ {function_name}'
}
###Oooooooooooooooo
## nabuo ng create-stub2.sh v0.1.2
## sa Tue, 18 Hunyo 2019 08:33:49 +0900
## tingnan mo
###Oooooooooooooooo
Pinagmulan: mapa.sh
Utos
itinapon {1..10} |mapa pow
Paglabas
14
9
16
25
36
49
64
81
100
Pag-andar ng filter gamit ang nabasa
Ipagpalagay na nais natin ang isang pag-andar ng filter na kumukuha ng isang listahan at nagbabalik ng isang sublist ng mga elemento na nagbibigay-kasiyahan sa mga kundisyon na itinakda ng isa pang pagpapaandar. Narito kung paano namin maaaring ipatupad ang isang function ng filter gamit ang read.
Script#! / baseng / bash
## filter
## bersyon 0.0.1 - pauna
###Oooooooooooooooo
salain() { { lokalfunction_name;function_name='$ {1}';}
lokalkotse
lokalcdr
lokalIFS
IFS='$ {indelimiter-}'
basahin -t 1kotse cdr|| bumalik ka
pagsusulit '$ (ideklara -f $ {function_name})' || bumalik ka
pagsusulit '$ {car}' || { totoo;bumalik ka;}
$ {function_name} '$ {car}' || itinapon -n '$ {car}'
itinapon '$ {cdr}' | $ {FUNCNAME} '$ {function_name}'
}
###Oooooooooooooooo
## nabuo ng create-stub2.sh v0.1.2
## sa Tue, 18 Hunyo 2019 13:19:54 +0900
## tingnan mo
###Oooooooooooooooo
Pinagmulan: filter.sh
Utos
kakaiba() { lokal -ako ako=$ {1};pagsusulit !$((ako% 2 )) -eq 1;}itinapon {1..10} |kakaiba ang filter
Paglabas
1 3 5 7 9Mga loop gamit ang nabasa
Ang mga loop na gumagamit ng nabasa ay nagbibigay-daan sa iyo upang umulit sa mga linya ng isang file na nabuo o mayroon nang.
Pangunahin habang binabasa ang loop para sa kaliwang bahagi (lhs)
Mayroon kaming isang utos o pag-andar (lhs) na maaaring makabuo ng mga linya sa isang file na maaaring ma-loop sa pamamagitan ng paggamit ng read at isang habang loop.
Bumuolhs| habang basahin
gawin
totoo
tapos na
lhs ay isangutosna nagbabalik ng isang listahan ng mga linya
Utos
seq 5 | habang basahinakogawin
itinapon $ {i}
tapos na
Paglabas
12
3
4
5
Pangunahin habang binabasa ang loop para sa kanang bahagi (rhs)
Mayroon kaming isang file (rhs) na may mga linya na maaaring mai-loop sa pamamagitan ng paggamit ng read at isang habang loop.
Bumuohabang basahin
gawin
totoo
tapos na <rhs
ang rhs ay afilenaglalaman ng mga linya
Utos
seq 5 >rhshabang basahinako
gawin
itinapon $ {i}
tapos na <rhs
Paglabas
1
2
3
4
5
Pasadyang lhs habang loop gamit ang nabasa
Mayroon kaming isang stream ng mga salita na nais naming loop sa pamamagitan ng paggamit ng nabasa.
Bumuo(
IFS='
lhs| habang basahin
gawin
totoo
tapos na
)
Ang lhs ay isang listahan ng mga salita
Utos
(IFS='
itinapon {1..5} | habang basahinako
gawin
itinapon '$ {i}
tapos na
)
Paglabas
1 2 3 4 5Nagbabasa mula sa anumang taut sa halip na karaniwang input
Ang pagpipiliang read builtin na madalas na naiwang hindi nagalaw ay ang isa na nagbibigay-daan sa iyo upang tukuyin kung ano ang babasahin ng deskriptor ng file, basahin -u FD. Bilang default ang FD ay kinuha upang maging karaniwang input.
Pangunahing konsepto
Kapag ang isang file na binuksan ang mga tagapaglarawan ng file ay nakatalaga. Ang pag-redirect ng IO sa bash ay nagbibigay-daan sa isang file na iwanang bukas na may isang tukoy na deskriptor ng file. Pinapayagan kaming sumulat sa file, basahin mula rito, at isara ito kapag tapos na kami.
_(){
pusa /dev/wala>myfifo;# walang laman na myfifo
exec 3<myfifo;# bukas na file myfifo bilang taut 3
itinapon 'Hello, Mundo! - mula sa fd 3 ' >myfifo;# sumulat sa myfifo
basahin -u 3;# basahin ang linya mula sa fd 3
exec 3> &-;# malapit sa Fi 3
itinapon $ {REPLY} # output line basahin mula sa tsar 3 bago isara
}
_# Kamusta, Mundo! mula sa fd 3
Ang pagbuo ng isang tren na may mga deskripsyon ng file at basahin -u FD
Para lamang sa kasiyahan nagpasya akong bumuo ng isang tren na may mga deskripor ng file at basahin -u FD. Sa bawat deskriptor ng file isang numero ang nakasulat. Ang bawat deskriptor ng file ay nagbabasa mula sa deskriptor ng file na 1 sa ibaba at ikinakabit sa sarili nito.
Linya ng utos
bashlinuxhint.com/magtayo/test-read-fd.sh tren10Paglabas
nagpapasimula sa fds ...nagpapasimula sa taut3...
taut3intialized
nagpapasimula sa taut4...
taut4intialized
fds intialized
pagbabasa mula sa taut3at4...
4 3
fds bago maglinis
0 1 2 3 4 5
paglilinis ...
paglilinis ng fds ...
tapos napaglilinis ng fds
fds pagkatapos maglinis
0 1 2 3
Laktawan ang pagpapaandar gamit ang read -u FD
Kung tumatakbo ka
uname -saMINGW64_NT-10.0DESKTOP-XVVVVVV 2.7.0(0.307/5/3)
2017.-02-17 14:dalawampux86_64 Msys
bash --versi
GNUbash, bersyon 4.4.12(1)-pakawalan(x86_64-pc-msys)
maaaring posible dahil sa isang bug upang magpatupad ng isang function na laktawan na laktawan ang sumusunod na linya sa isang bash script sa labas ng mga pag-andar bago basahin ang mapagkukunan ng script. Tandaan na hindi ito gagana sa karamihan ng mga system. Halimbawa,
uname -saLinux 4.9.0-8-amd64# 1 Debian SMP 4.9.144-3.1 (2019-02-19) x86_64 GNU / Linux
bash --versi
GNUbash, bersyon 4.4.12(1)-pakawalan(x86_64-pc-linux-gnu)
hindi lumilipad.
Pag-andar
laktawan() { basahin -u 31;}
Utos
laktawanitinaponlumaktaw ang linya
totoo
Paglabas
(walang laman)Linya sa ilalim
Ang nabasang builtin sa bash ay higit pa sa mahuli ang input ng gumagamit. Maaari itong magamit sa mga pag-andar, mga loop at palitan sa pagitan ng mga tagapaglaraw ng file na ginamit sa bash script. Sa okasyon ng paggalugad gamit ang read at file deskors ay maaaring magbunga ng mga itlog ng Easter.