Басх теорија

/ бин / басх

0. Индекс

  1. Ствари које се дешавају већини људи
  2. Структура скрипте
  3. Штампање на екрану
  4. Читај корисника ИНПУТ
  5. Прорачуни у басх
  6. Услови
  7. Лоопс
  8. funkcije
  9. Гетопс

1. Ствари које се дешавају већини људи

/ бин / басх или / бин / сх

Једна од првих ствари које машина ради приликом извршавања наше скрипте је да види са којом шкољком би то требало да уради. На већини актуелних линук система / Бин / сх је веза до / бин / басх, али то није увек случај, на пример у дистрибуцијама које користе бусибок довести Sh а обично и доносе Басх, али ако користите / Бин / сх, неће се покретати са Басхом. Због тога препоручујем увек употребу / бин / басх.

Уницоде вс АСЦИИ

Да ли сте се икад запитали зашто у својим скриптама не можете да користите „¿“ или „н“? Или користити акценте? То може бити прилично досадно у интерактивним скриптама. То је зато што је подразумевано кодирање Басха АСЦИИ, или што је исто, енглески знак. Да бисмо је променили, морамо само да кажемо нашој скрипти да желимо да користимо Уницоде. За то морате додати линију одмах након интерпретатора наредби:

# - * - КОДИРАЊЕ: УТФ-8 - * -

Будите опрезни, важно је да је овај ред на почетку скрипте.

Нека скрипта буде извршна

Смешно је колико људи користи скрипте са «$ басх сцрипт.сх" уместо "$ ./сцрипт.сх'Напокон, за ово смо дефинисали љуску.

Да бисте додали дозволе за извршење, морате извршити:

судо + к скрипта.сх
Ако је наша скрипта извршна, можемо је додати у наш ПАТХ и учинити извршном са било ког места / директоријума на рачунару. За то морамо додати или .басхрц нашег корисника или у / етц / басхрц ред
БИН = "директоријум у којем имамо скрипте" ПАТХ = "$ БИН $ ПАТХ"
Басх правило је писање имена променљивих великим словима. Многи људи се не придржавају овог правила, али за дугачке скрипте је цењено јер их чине много читљивијим

2. Структура скрипте

  1. Узглавље
  2. Дефиниција глобалних променљивих
  3. Упомоћ
  4. funkcije
  5. Главни део

Заглавље је место где назначујемо коју љуску желимо да користимо и кодирање. Предност функција је поновна употреба кода који се понавља тако што се напише само једном и како би се лакше разумело скрипту, јер је код који прелази 100 редова врло користан.

Да би користили функције, оне морају бити дефинисане са пре главног дела наше скрипте. А ако желимо да користимо променљиве на глобалном нивоу целе наше скрипте, како у главном делу тако и у функцијама, морамо их дефинисати на почетку свега, одмах након заглавља.

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

фунцтион хелп () {ецхо "" "Наш добро форматиран текст помоћи." "" излаз ако [[-з $ 1 || $ 1 == "-х" || $ 1 == "--хелп"]]; онда помози фи

Ако у функцију помоћи додамо „екит“, скрипту ћемо изаћи сваки пут када покренемо помоћ, на пример након порука о грешкама итд. Уштедели смо неколико редова кода.

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

Коришћење 3 наводника са ецхо-ом омогућава коришћење прелома редова без остављања поруке да се прикаже ецхо-ом. За вишередне поруке много је погодније користити ехо само једном.

3. Штампање на екрану

Постоје две главне команде за штампање на екрану у басх: ​​«одјек"И"принтф«. Обоје су једнако брзи и обојица су део басха. Главна разлика за почетнике је та што ехо додаје нову линију на крају, док «принтф"Не.

Ецхо је врло добар и оно је што већина људи користи, међутим, приликом читања корисниковог ИНПУТ-а или када желите да одштампате променљиве преузете из датотека обрадом текста, могу се догодити необичне ствари. Обично се лако решавају, лако попут промене двоструких наводника у једноструке или обрнуто или уклањања референци променљивих из наводника. «Одјек»Да ли и чудне ствари зависе од тога како је компајлиран, ако увек користимо Убунту или увек Федору, то не утиче на нас, али ако променимо дистрибуцију то чини.

Због тога користим «принтф«, Што ме не боли у глави, а такође се понаша више као«принтф»Из Ц или«штампа»За Питхон је ово веома важно ако икада пожелите да своју скрипту пренесете на други програмски језик.

За опширнију дискусију можете посетити ово питање од Уник-а и Линука на Стацк Екцханге-у.

4. Прочитајте корисника ИНПУТ

Све што напишемо након назива наше скрипте и пре него што притиснемо тастер ЕНТЕР аутоматски се чува у посебним променљивим. Ове променљиве су типа $ Кс где је Кс број.

«$0»Означава назив наше скрипте и од«$1»До бесконачности све што смо касније написали је променљиво. На пример:

мачка << ЕОФ >> тест.сх #! / бин / басх # - * - КОДИРАЊЕ: УТФ-8 - * - принтф "\ $ 0 = $ 0 \ н" принтф "\ $ 1 = $ 1 \ н" принтф "\ $ 2 = $ 2 \ н "ЕОФ цхмод + к сцрипт.сх ./сцрипт.сх моја датотека.ткт

Направимо тест скрипту, учинимо је извршном и покренимо је са 2 параметра. Добијамо излаз на екрану:

$ 0 = ./сцрипт.сх $ 1 = мој $ 2 = филе.ткт

Користећи наводнике могли смо проследити „ми филе.ткт“ у „$ 1“.

Такође можемо прочитати ИНПУТ корисника помоћу наредбе „реад“, директно указујући на променљиву где желимо да сачувамо параметар. На пример:

принтф "Како се зовеш? \ н" прочитај ИМЕ принтф "Здраво, $ НАМЕ. \ н"
Будите опрезни са додељивањем променљивих. „$ ВАР = цонтент“ ће произвести грешку, не смеју се остављати размаци између знака једнакости, имена променљиве и садржаја. Исправна употреба је „ВАР = садржај“

5. Калкулације у Басху

За то можемо користити «екпр«Све док нам не треба да радимо сложене прорачуне. Треба напоменути две ствари, прва је да «екпр»Прихватају се само цели бројеви, друго је да подела враћа цео резултат, да видимо остало што можемо користити«%".

Обично ћемо желети да додамо резултат екпр променљивој. То можемо учинити на два начина:

ВАР2 = `израз $ ВАР1 / 10` ВАР2 = $ (израз $ ВАР1 / 100)

Такође можете прескочити «екпр»Коришћење двоструких заграда:

ВАР2 = $ (($ ВАР1 / 100))
За даље објашњење «екпр»Или алтернативу која користи целе бројеве, можете погледати овај запис КЗКГ ^ гаара.

КСНУМКС Услови

Већ је врло опширно написано о «if«,«друго«,«elif»И услови. О томе можете прочитати у:

Само желим да истакнем разлику између употребе једноставних угластих заграда, «[]«, И двоструке заграде,«[[]«, За услове. Двоструким заградама можемо користити додатне услове:

  • «&&»За и
  • «||»За или

Користити "&&"И"||»Једноставним угластим заградама сваки део треба раздвојити између засебних углатих заграда. Пример који се користи за део скрипте који изгледа да ли треба извршити помоћ био би:

иф [-з "$ 1"] || ["$ 1" == "-х"] || ["$ 1" == "- помоћ"]]; онда помози фи

Такође нас штеди од потребе да имена променљивих пишемо у наводнике да бисмо спречили грешке. На пример:

ако [$ 1 = 1]; затим принтф "Параметар је једнак 1."; фи ако ["$ 1" = 1]; затим принтф "Параметар је једнак 1."; фи ако [[$ 1 = 1]]; затим принтф "Параметар је једнак 1."; фи

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

басх: ​​[: =: очекује се унарни оператор
У басху се „=" и „==" тумаче на исти начин. То се не дешава у другим програмским језицима где се "=" користи само за додељивање променљивих.

Оно о чему се није говорило је «случај«, Што се користи за поједностављење«if«. Почнимо од почетка, када немамо ниједну «if»Сав код ће бити извршен. Ако додамо услов «if»Имат ћемо два случаја, један у којима је блок кода унутар«if»И други случај када се овај блок не извршава.

Ако додамо «друго«Такође ћемо имати два случаја, али ова два случаја се разликују од претходних. Јер сада ће постојати два условна блока кода, А и Б, и Ц блок, што је остатак програма. А или Б ће се извршити и Ц. У претходном случају су то били А и Ц или само Ц.

Да би се избегли услови писања «ако друго" у склопу "друго»И да би се поједноставило читање кода, он је створен«elif«. Када имамо много услова који зависе од претходног, на пример опсег бројева или тип:

ВАР1 = $ 1 ако [[$ ВАР1 = 1]]; затим принтф "1 \ н" елиф [[$ ВАР1 = 2]]; затим принтф "2 \ н" елиф [[$ ВАР1 = 3]]; онда принтф "3 \ н" иначе принтф "ноне \ н" фи

У случају последњег «elif»Прочитаће се многи услови. У случају да се овај процес поједностављује:

ВАР1 = $ 1 случај $ ВАР у 1) принтф "1 \ н" ;; 2) принтф "2 \ н" ;; 3 | 4) принтф "3 или 4, зависи \ н" ;; *) принтф "ноне \ н" ;; да је Ц.

Прочитаће се променљива, у овом случају ВАР1, и видеће се да ли је еквивалентна неком од случајева, ако не, извршиће се подразумевани случај "*". Двоструке тачке са зарезом еквивалентне су «разбити", Кажу"случај»То мора да се заврши.

«случај»Може се користити и као низ«if«, За то морате користити« ;; & »(наставити) уместо« ;; » (зауставити).

7. Петље

Веома је мало петљи познато у било ком програмском језику. У Басху су «док«,«до"И"за«. О овоме је већ написано у блогу:

Постоје две врсте петљи «за«, Они који су типа«$ за ВАР у ЛОКУЕСЕА»А шта су од типа Ц«$ за ((И = 0; И <= 10; И ++))«. Друга врста петљи «за»Веома су корисни, има 3 дела на почетку петље:

  • Декларација и покретање променљивих (у овом случају помоћна променљива „И = 0“).
  • Услов извршења (док не будем мањи или једнак 10).
  • Повећање помоћне променљиве

По мом мишљењу то је најмоћнија петља од свих. Пример који штампа све бројеве од 0 до 10, укључујући:

#! / бин / басх за ((И = 0; И <= 10; И ++)); уради принтф "$ И \ н" готово

8. Функције

Постоје неке ствари које нам Басх не дозвољава, зар не? На први поглед басх функције спречавају вас да направите 3 ствари: декларирање локалних променљивих у функцијама, прослеђивање параметара функцијама и враћање параметара. Све има решење.

Не радите ништа попут:

#! / бин / басх ВАР = 1 принтц "$ ВАР \ н" функција поздрав () {ВАР = 2 принтф "$ ВАР \ н"} поздрав принтф "$ ВАР \ н"

Ово се штампа на екрану 1, 2 и 2.

Да бисте декларисали локалне променљиве, додајте «локална»Приликом изјашњавања:

#! / бин / басх ВАР = 1 принтф "$ ВАР1 \ н" функција фоо () {лоцал ВАР1 = 2 принтф "$ ВАР1 \ н"} принтф "$ ВАР1 \ н" фоо принтф "$ ВАР1 \ н"

Ово одштампа 1, 1, 2, 1 на екрану.

Како прослеђујете параметре функцији?

#! / бин / басх # - * - КОДИРАЊЕ: УТФ-8 - * - функција здраво () {принтф "Здраво $ 1 \ н"}

принтф "Како се зовеш? \ н"
прочитајте ВАР1
здраво $ ВАР1

Како се враћају параметри?

#! / бин / басх # - * - КОДИРАЊЕ: УТФ-8 - * - функција здраво () {принтф "Здраво холита"} принтф "Како се зовеш? \ н" прочитај ВАР1 ВАР1 = $ (здраво) # ЕВО ГДЕ ЈЕ принтф "$ ВАР1 $ ВАР2 \ н"

Као што видите, ово има два недостатка, можете вратити само један параметар, који може бити вектор 😀, а ако желите вратити параметар, више не можете да штампате на екрану из те функције.

Више ствари о функцијама можете пронаћи на [урл=хттпс://блог.desdelinux.нет/програмандо-ен-басх-парте-3/]овај чланак из Усемослинук-а[/урл].

9. Гетопс

Једна од последњих ствари које треба да знате о Басху да бисте креирали сложене скрипте је «гетопс«. Користи се за прослеђивање опција скрипти без обзира на редослед. Једина мана је што утиче само на кратке опције:

#! / бин / басх # - * - КОДИРАЊЕ: УТФ-8 - * - ВАРЦ = 0 функција хелп () {принтф "Порука помоћи \ н" екит} ако [[-з $ 1]]; затим помозите фи док гетоптс: ха: б: ц ОПТ; уради случај $ ОПТ у х) помоћ ;; :) помоћ ;; а) ВАРА = $ ОПТАРГ ;; б) ВАРБ = $ ОПТАРГ ;; в) ВАРЦ = 1 ;; \?) помоћ ;; есац доне # Главни блок скрипте који # ради ствари са ВАРА, ВАРБ и ВАРЦ

«Гетоптс»Чита опције једну по једну, па је потребна петља.

Постоје 2 врсте опција које се могу проследити помоћу «гетоптс":

  • Параметри звани заставице, у овом случају -ц или -х. Наведени су словом које желимо да користимо. Они су попут логичких променљивих, «прави»(Аре) или«лажан„(Они нису овде).
  • Параметри са придруженим аргументима, -а било што, -б било што. Наведени су словом које желимо са двотачком испод. Аргумент се чува у ОПТАРГ-у (ово име је непроменљиво).
Почетне двоструке тачке не показују грешке.

Шта ради ова скрипта?

Приказује поруку помоћи када се не проследи ниједна опција, када се проследи параметар „-х“, када се проследи неважећи параметар (на пример „-к“, то чини „\?“) Или када се важећи параметар без аргумента (":"). У остатку случајева чува присуство „-ц“ као 1 у ВАРЦ, а вредности прослеђене са „-а“ и „-б“ у ВАРА и ВАРБ.


Оставите свој коментар

Ваша емаил адреса неће бити објављена. Обавезна поља су означена са *

*

*

  1. За податке одговоран: Мигуел Ангел Гатон
  2. Сврха података: Контрола нежељене поште, управљање коментарима.
  3. Легитимација: Ваш пристанак
  4. Комуникација података: Подаци се неће преносити трећим лицима, осим по законској обавези.
  5. Похрана података: База података коју хостује Оццентус Нетворкс (ЕУ)
  6. Права: У било ком тренутку можете ограничити, опоравити и избрисати своје податке.

  1.   елав дијо

    МАЈСТОРНО. Не кажем више У_У

  2.   Мигуел дијо

    Здраво врло добар чланак.
    Хеј, ставили сте да дате дозволе судо + к уместо цхмод + к

    1.    Хенри дијо

      $ судо цхмод + к сцрипт.сх
      (Тачније, хехе)

      Ах, честитам и хвала!

  3.   ватрена дијо

    Врло добар пост, заиста вам честитам, наставите тако, поздрав

  4.   Густаво дијо

    А ако желите да скрипта буде видљива када се изврши, корак по корак, видећи на пример како се понашају променљиве, услови и све друго, можете да користите:

    сх -к скрипта

    поздрави

  5.   даго дијо

    КОМАД туторства. Одлично и врло добро објашњено.
    Хвала.

  6.   Габријел дијо

    Одличан пост на ту тему 😉

  7.   Марио Гуиллермо Завала Силва дијо

    Врло занимљиво и важно, хвала на информацијама….
    ЖИВЕЛИ !!!

  8.   Нотфромброоклин дијо

    Хвала свима на честиткама, што се тиче команде Мигуел, он ми не дозвољава да изменим унос након што се објави. Морам то учинити, претпостављам.

  9.   Адријан дијо

    Врло добар!

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

    Међутим, пронашао сам неколико детаља које мислим да би требало исправити.

    Прво: у одељку «2. СТРУКТУРА СКРИПТА »функција није затворена, што ће узроковати проблеме при извршавању у скрипти.
    Решење би било додати заграду одмах након команде „екит“.

    Друго: у одељку «4. ПРОЧИТАЈТЕ КОРИСНИЧКИ УЛАЗ “потврђујете да се параметри које корисник може унети крећу од 0 до бесконачно, међутим„ басх “ће тумачити само од 0 до 9 долара, јер би 10 долара било једнако 1 + 0.
    Да бисте решили овај проблем, можете користити команду "схифт" да бисте зграбили следеће променљиве. Или наведите променљиву у заградама „$ {10}“, тако да басх узима вредности заједно, а не као $ 1 + 0.

    Без даљег поздрављања!

    1.    Нотфромброоклин дијо

      Хвала за ваш коментар. Потпуно није успело да објасни тачну употребу екит-а, како у скрипти, тако и у функцијама. Што се тиче {10} долара, никада нисам толико завештао, па нисам наишао на тај проблем, добро је знати да за то постоји решење (већ сам прецртао ново научено данас 😀).

  10.   цханио дијо

    Хвала вам пуно на чланку! Неке ствари које помињете још увек нису имале разјашњења. На пример, гетопс.
    У делу излаза са екрана морали сте да поменете мачку коју касније помињете ...
    мачка <
    ***************************************
    * ОВАЈ ОБРАЗАЦ ЈЕ ВРЛО ЕКСПРЕСИВАН *
    ***************************************
    ЕОФ

    У вашем примеру:
    мачка << ЕОФ >> тест.сх
    Треба споменути две ствари ... >> то је „додај“, односно ако поновите исту наредбу, имат ћете целу скрипту у дупликату ... Требали бисте користити само једну ...
    мачка << ЕОФ> сцрипт.сх
    Да, требало би да се зове и сцрипт.сх
    Затим у
    иф [-з "$ 1"] || ["$ 1" == "-х"] || ["$ 1" == "–помоћ"]]; онда
    помоћи
    fi

    Мислим да би то требало написати ...
    ако [[-з "$ 1"] || ["$ 1" == "-х"] || ["$ 1" == "–помоћ"]]; онда
    ...

    Из БАСХ-а можете открити још много тога.
    Можете ли да га насловите "ОСНОВЕ"? 🙂
    На пример, параметар „тестери“ попут -з да бисте видели јесу ли празни или -ф да бисте видели да ли постоји као датотека.

    Хвала још једном на вашем труду.
    алберто

  11.   цлов_ериол дијо

    Веома добар басх туториал!

  12.   оцз дијо

    -- КОДИРАЊЕ: УТФ-8 --

    То је први пут да видим ту линију за постављање кодирања знакова у басх скрипти. Изгледа типичније за Питхон него за Басх. Да ли је заиста потребно? Потражио сам референцу на Гоогле-у, али не могу ништа да пронађем, да ли имате при руци везу која говори о овом питању? Конкретно о погодности те линије.

    По мом мишљењу, да бисте писали скрипте у Басху користећи УТФ-8, потребно је само да сачувате текстуалну датотеку као такву (без БОМ-а) и да имате одређене променљиве окружења (ЛАНГ и ЛЦ_ *), правилно постављене.
    Тада је, очигледно, неопходно да се извршене наредбе припреме за кодирање осим АСЦИИ. На пример, ако желимо да пређемо на велика слова, ово изгледа не функционише:
    «Ецхо аеиоу | тр аз АЗ »
    o:
    «Ецхо аеиоу | тр [: доњи:] [: горњи:] »
    и боље је користити:
    «Ецхо аеиоу | авк '{принт тоуппер ($ 0)}' ».

    1.    боррикуито попут тебе дијо

      Неко ме исправи, али та линија за кодирање (# -- КОДИРАЊЕ: УТФ-8 --) Нема никакве везе са басх-ом или љуском: то је линија за коментаре (почиње са #) и служи да каже УРЕДНИКУ који користимо за писање скрипте (вим, емацс ...) кодирање датотеке.

      Заправо, басх не види такву линију, јер је то линија коментара.

  13.   ЈоРгЕ-1987 дијо

    Одличан водич, јер Сисадмин зна познавање скрипти у Басху од суштинске је важности, корисно је за све.

    Веома веома добра!

    Поздрав!

  14.   Едуардо Цуомо дијо

    У случају да је некоме корисно, ево неколико примера и примера за стварање сопствених скрипти: https://github.com/reduardo7/hsabx

  15.   Лито Блацк дијо

    Врло добар. Нове ствари које треба додати мојим скриптама. Ствар са енкодирањем и са принтф-ом то нису имали.
    Хвала вам!!!

  16.   ккктониккк дијо

    Јао добар чланак! Овај држим за фаворите, било би лепо исправити оно што није у реду, па чак и проширити га са више садржаја. Аплауз за све ове информације !!!!