Басх команда за читање

Bash Read Command



Читајте или умрите пријатељи. Команда реад је једнако важна као и позициони параметри и наредба ецхо. Како ћете иначе хватати унос корисника, прихватати лозинке, писати функције, петљати и завиривати у дескрипторе датотека? Прочитајте на.

Шта се чита?

Читање је басх уграђена команда која чита садржај линије у променљиву. Омогућава раздвајање речи које је везано за посебну променљиву љуску ИФС. Првенствено се користи за хватање корисничког уноса, али се може користити и за имплементацију функција које уносе са стандардног уноса.







Басх прочитајте помоћ за уграђену команду

Пре него што уђемо у то како да користимо наредбу реад у басх скриптама, ево како ћемо добити помоћ. Тамо би требало да видите све доступне опције за наредбу реад заједно са описима које ћемо покушати да покријемо у примерима.



Командна линија



помоћ читати

Оутпут





читати:читати [-ерс] [-низ] [-д удео] [-и текст] [-н ​​нцхарс] [-Н нцхарс]
[-п промпт] [-т тимеоут] [-у фд] [име ...]

Прочитајте ред са стандардног уноса иразделитито у поља.

Чита један ред са стандардног улаза или сафиледескриптор ФД
акотхеопција је испоручена. Линија јеразделитиу пољакаоса речју
цепање, а прва реч је додељена првом ИМЕ, друга
реч другом НАМЕ, и тако даље, са свим преосталим речима додељеним
тхепоследњиНАМЕ. Пронађени су само ликовиу $ ИФСсу препознатикаореч
граничници.

Ако се не дају имена НАМЕ, линијачитатиускладиштеноупроменљива РЕПЛИ.

Опције:
-дониз додељује речичитатина секвенцијалне индексе низа
променљива АРРАИ, почиње од нуле
делимНастави све докпрви знак ДЕЛИМА јечитати, радије
него нови ред
-е користите Реадлине за добијање линијеуинтерактивна љуска
текст користи ТЕКСТкаопочетни текстзаРеадлине
нцхарсповратакнакон читања знакова НЦХАРС уместо чекања
занови ред, али частите граничникакомање од

НЦХАРС знакови сучитатипре граничника
нцхарсповратактек након читања тачно НЦХАРС знакова, осим ако
ЕОФ се сусреће иличитати путаван, игноришући било које
граничник
-ппромпт исписује низ ПРОМПТ без претходног новог реда
покушавајући дачитати
урадитине дозволите да обрнуте косе црте избегну било који знак
урадитинеИзбациоулаз који долази са терминала
пауза у утакмицивремеван иповратакнеуспехакодокомплетанлинија од
унос нијечитатиу року од ТИМЕОУТ секунди. Вредност
ТМОУТ променљива је подразумевано временско ограничење. ТИМЕОУТ може бити а
разломачни број. Ако је ТИМЕОУТ0,читативраћа
одмах, без покушајачитатибило који податак, враћање
само успехакоулаз је доступан на наведеном
филедескриптор. Тхеизлазстатус већи од128
аковременско ограничење је прекорачено
фдчитатифромфиледескриптор ФД уместо стандардног улаза

Статус изласка:
Тхеповратаккод је нула, осим ако се наиђе на крај датотеке,читати путаоут
(у која случајуто'с тхан 128), грешка при додељивању променљиве

Хватање уноса корисника

Интерактивне басх скрипте су ништа без хватања корисничког уноса. Уграђени програм за читање пружа методе којима се кориснички унос може ухватити унутар басх скрипте.

Хватање линије уноса

Да бисте ухватили ред уноса, читање не захтева имена и опције. Када НАМЕ није наведено, променљива РЕПЛИ се користи за складиштење уноса корисника.



Команде

{
Избацио 'Откуцајте нешто и притисните ентер:';
читати;
ИзбациоТи си откуцао$ {РЕПЛИ}
}

Оутпут

Откуцајте нешто и притисните ентер: нешто(Нова линија)
Уписао си нешто

Хватање речи за унос

Да бисте ухватили реч уноса, потребна је опција -д. У случају речи бисмо поставили -д на размак, читајући '-д'. Тада корисник притисне размакницу за читање учитаће РЕПЛИ са речју.

Имајте на уму да када је опција -д подешена, бацкспаце не ради како се очекивало. За повратак, док покушавате да ухватите реч уноса, може се користити опција -е, читати -е ‘-д’.

Команде

{
Избацио 'Откуцајте нешто и притисните размак:';
читати '-д';
Избацио '';
Избацио 'Откуцали сте$ {РЕПЛИ}'
}

Оутпут

Откуцајте нешто и притисните размак: нешто(простор)
Уписао си нешто

Брзи корисник

У интерактивним басх скриптама позивање корисника може захтевати поруку која ће му рећи који се унос очекује. Ово увек можемо постићи помоћу уграђеног еха. Међутим, испоставило се да постоји опција која користи читање.

Затражите од корисника реч

У хватању речи уноса, користили смо ецхо да напишемо Типе сометхинг и притиснемо размак: на стандардни излаз пре читања „-д“. Опција -п дозвољава приказивање поруке пре читања са стандардног уноса.

Команде

{
читати -п 'Откуцајте нешто и притисните размак:' '-д';
Избацио '';
Избацио 'Откуцали сте$ {РЕПЛИ}'
}

Оутпут

Откуцајте нешто и притисните размак: нешто(простор)
Уписао си нешто

Од корисника затражите тајну

Када ухватите кориснички унос без појављивања на терминалу, опција -с добро дође. реад -с -п вам омогућава да ухватите и сакријете кориснички унос на следећи начин.

Команде

{
читати -п „Откуцајте нешто што обећавам да ћу чувати као тајну:“
Избацио '';
Избацио 'Твоја тајна је сигурна са мном';унсетОДГОВОРИТИ ;
Избацио '$ {РЕПЛИ}'
}

Оутпут

Откуцајте нешто што обећавам да ћу држати у тајности:
Твоја тајна је сигурна са мном

Функције помоћу читања

Ево примера функција у басху које користе читање и стандардни унос

Основни концепт

Функције које користе читање користе стандардне улазне параметре и параметре. Главни улаз који треба да буде процес, као што су линије у датотеци, пролази кроз стандардни улаз кроз цев. Други уноси ако постоји и опција се прослеђују као параметри.

читати 1НАМЕ1 НАМЕ2 ...

читатијеизграђен команда

-т 1 спречава басх скрипту да неограничено чека да се ред врати кроз стандардни унос. Ако је стандардни улаз у почетку празан, функција се враћа са излазним кодом 142 који означава да ниједан датум није прочитан унутар подешеног временског ограничења

НАМЕ1 НАМЕ2 су имена променљивих

... многи називи променљивих могу бити наведени

Сада када су основе постављене, да видимо како изгледају познате функције имплементиране помоћу реад -а.

Придружите се функцији користећи реад

Претпоставимо да желимо функцију придруживања која узима листу речи и враћа другу листу речи спојених граничником. Ево како можемо имплементирати функцију придруживања користећи реад.

Скрипта

#!/бин/басх
## придружити
## верзија 0.0.2 - поправите параметре рекурзије
##################################################
придружити() { { локалнимлимитер;лимитер='{1} УСД';локалнимоутделимитер;
оутделимитер='$ {2-.}';}
локалнимауто
локалнимцдр
локалнимИФС
ИФС='$ {инделимитер}'
читати 1ауто цдр|| повратак
тест '$ {цдр}' || { Избацио '$ {цар}';повратак;}
Избацио '$ {цар}$ {оутделимитер}$ {цдр}' | $ {ФУНЦНАМЕ} '$ {инделимитер}'
'$ {оутделимитер}'
}
##################################################
## генерисао цреате-стуб2.сх в0.1.2
## у понедељак, 17. јуна 2019 12:24:59 +0900
## види
##################################################

Извор: јоин.сх
Командна линија

Избациоа б| придружити

Оутпут

а.б

Командна линија

Избациоа б| придружити | придружити. |

Оутпут

до|б

Мапирајте функције користећи реад

Претпоставимо да желимо функцију мапе која узима листу и враћа другу листу која садржи исти број елемената које је модификовала друга функција. Ево како можемо имплементирати функцију карте користећи реад.

Скрипта

#!/бин/басх
## Мапа
## верзија 0.0.1 - почетна
##################################################
Мапа() { { локалнимфунцтион_наме;име_функције='{1} УСД';}
локалнимауто
локалнимцдр
локалнимИФС
ИФС='$ {инделимитер-}'
читати 1ауто цдр|| повратак
тест '$ (декларишите -ф $ {име_функције})' || повратак
тест '$ {цар}' || { истина;повратак;}
$ {име_функције} $ {цар}
Избацио '$ {цдр}' | $ {ФУНЦНАМЕ} '$ {име_функције}'
}
##################################################
## генерисао цреате-стуб2.сх в0.1.2
## у уторак, 18. јуна 2019 08:33:49 +0900
## види
##################################################

Извор: мап.сх
Команде

НС() { локалним и={1} УСД;Избацио$((и** 2 ));}
Избацио {1..10} |мап пов

Оутпут

1
4
9
16
25
36
49
64
81
100

Функција филтрирања помоћу читања

Претпоставимо да желимо функцију филтера која узима листу и враћа подлисту елемената који задовољавају услове постављене другом функцијом. Ево како можемо имплементирати функцију филтера користећи реад.

Скрипта

#!/бин/басх
## филтер
## верзија 0.0.1 - почетна
##################################################
филтер() { { локалнимфунцтион_наме;име_функције='{1} УСД';}
локалнимауто
локалнимцдр
локалнимИФС
ИФС='$ {инделимитер-}'
читати 1ауто цдр|| повратак
тест '$ (декларишите -ф $ {име_функције})' || повратак
тест '$ {цар}' || { истина;повратак;}
$ {име_функције} '$ {цар}' || Избацио '$ {цар}'
Избацио '$ {цдр}' | $ {ФУНЦНАМЕ} '$ {име_функције}'
}
##################################################
## генерисао цреате-стуб2.сх в0.1.2
## у уторак, 18. јуна 2019 13:19:54 +0900
## види
##################################################

Извор: филтер.сх

Команде

непаран() { локалним и={1} УСД;тест !$((и% 2 )) -ек 1;}
Избацио {1..10} |филтер непаран

Оутпут

1 3 5 7 9

Петље помоћу читања

Петље које користе читање омогућавају вам да прођете кроз редове датотеке која треба да се генерише или већ постоји.

Основна петља читања за леву страну (лхс)

Имамо команду или функцију (лхс) која може генерисати редове у датотеци који се могу петљати помоћу реад и вхиле петље.

Цонструцт

лхс| док читати
урадити
истина
Готово
лхс је акомандакоји враћа листу линија

Команде

сек 5 | док читатии
урадити
Избацио $ {и}
Готово

Оутпут

1
2
3
4
5

Основна петља читања за десну страну (рхс)

Имамо датотеку (рхс) са линијама које се могу провући помоћу читања и петље вхиле.

Цонструцт

док читати
урадити
истина
Готово <рхс

рхс је афилекоји садрже линије

Команде

сек 5 >рхс
док читатии
урадити
Избацио $ {и}
Готово <рхс

Оутпут

1
2
3
4
5

Прилагођени лхс вхиле лооп користећи реад

Имамо низ речи које бисмо хтели да прођемо кроз читање.

Цонструцт

(
ИФС=''
лхс| док читати
урадити
истина
Готово
)

лхс је списак речи

Команде

(
ИФС=''
Избацио {1..5} | док читатии
урадити
Избацио '$ {и}
Готово
)

Оутпут

1 2 3 4 5

Читање са било ког фд -а уместо стандардног уноса

Уграђена опција читања која често остаје нетакнута је она која вам омогућава да наведете из ког описника датотеке да читате, читајте -у ФД. Подразумевано се ФД узима као стандардни улаз.

Основни концепт

Када се датотека отвори, додељују јој се дескриптори. ИО преусмеравање у басх омогућава да се датотека остави отворена са одређеним дескриптором датотеке. Дозвољено нам је писање у датотеку, читање из ње и затварање кад завршимо.

_()
{
мачка /дев/нула>мифифо;# празан мифифо
екец 3<мифифо;# отворена датотека мифифо као фд 3
Избацио 'Здраво Свете! - од фд 3 ' >мифифо;# пиши на мифифо
читати 3;# прочитана линија са фд 3
екец 3> &-;# затвори фд 3
Избацио $ {РЕПЛИ} # излазна линија очитана са фд 3 пре затварања
}
_# Здраво Свете! са фд 3

Изградња воза са дескрипторима датотека и читањем -у ФД

Из забаве сам одлучио да направим воз са описима датотека и читањем -у ФД. Сваком дескриптору датотеке уписује се број. Сваки дескриптор датотеке чита из дескриптора датотеке 1 испод и додаје се себи.

Командна линија

басхлинукхинт.цом/градити/тест-реад-фд.сх воз10

Оутпут

иницијализација фдс -а ...
иницијализација фд3...
фд3инцијализовано
иницијализација фд4...
фд4инцијализовано
фдс интиализед
читање са фд3и4...
4 3
фдс пре чишћења
0 1 2 3 4 5
чишћење ...
чишћење фдс -а ...
Готовочишћење фдс
фдс након чишћења
0 1 2 3

Прескочите функцију користећи реад -у ФД

Ако трчите

унаме -до
МИНГВ64_НТ-10.0ДЕСКТОП-КСВВВВВВ 2.7.0(0.307/5/3)
2017.-02-17 14:двадесетк86_64 Мсис
басх --верзија
ГНУбасх, верзија 4.4.12(1)-издање(к86_64-пц-мсис)

због грешке је могуће имплементирати функцију прескакања која прескаче следећи ред у басх скрипти изван функција пре читања извора скрипте. Имајте на уму да то не ради на већини система. На пример,

унаме -до
Линук 4.9.0-8-амд64#1 Дебиан СМП 4.9.144-3.1 (2019-02-19) к86_64 ГНУ/Линук
басх --верзија
ГНУбасх, верзија 4.4.12(1)-издање(к86_64-пц-линук-гну)

скип не лети.

Функција

прескочити() { читати 31;}

Команде

прескочити
Избациолинија прескочена
истина

Оутпут

(празна)

Суштина

Читани уграђени басх више од хватања корисничког уноса. Може се користити у функцијама, петљама и размени између дескриптора датотека који се користе у басх скриптама. Понекад се истраживањем помоћу описа и читања датотека могу добити ускршња јаја.