Basahin ang utos

Bash Read Command



Basahin o mamatay ang mga kaibigan. Ang binasang utos ay kasinghalaga ng mga posisyong parameter at ang utos ng echo. Paano pa mahuhuli mo ang pag-input ng gumagamit, tatanggap ng mga password, magsulat ng mga pag-andar, loop, at silip sa mga tagapaglaraw ng file? Basahin mo pa.

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

itinaponisang b| sumali ka

Paglabas

a.b

Linya ng utos

itinaponisang b| sumali ka | sumali ka. |

Paglabas

sa|b

Mga 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

NS() { lokal -ako ako=$ {1};itinapon$((ako** 2 ));}
itinapon {1..10} |mapa pow

Paglabas

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

Mga 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.

Bumuo

lhs| habang basahin
gawin
totoo
tapos na
lhs ay isangutosna nagbabalik ng isang listahan ng mga linya

Utos

seq 5 | habang basahinako
gawin
itinapon $ {i}
tapos na

Paglabas

1
2
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.

Bumuo

habang basahin
gawin
totoo
tapos na <rhs

ang rhs ay afilenaglalaman ng mga linya

Utos

seq 5 >rhs
habang 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 5

Nagbabasa 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 tren10

Paglabas

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 -sa
MINGW64_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 -sa
Linux 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

laktawan
itinaponlumaktaw 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.