Bash скриптовете са високоефективно средство за автоматизиране на задачи, особено тези, които се възползват от други съществуващи програми. Тази автоматизация често изисква повторение на подобна операция няколко пъти, което е точно когато за цикъл влиза в своите права.

Системните администратори на Linux и Mac обикновено са запознати със скриптове чрез терминала, но дори потребителите на Windows могат включете се в действието с подсистемата на Windows за Linux.

Как да получите Linux Bash Shell на Windows 10

Трябва да използвате Linux няма време за превключване на друг компютър или стартиране на виртуална машина? Стартирайте Linux в Windows 10 с терминал Bash shell вместо това!

Как работят Bash скриптовете

Скриптът на bash е просто обикновен текстов файл, съдържащ поредица от команди, които черупката на bash може да чете и изпълнява. Bash е черупката по подразбиране в macOS преди Catalina и повечето дистрибуции на Linux.

Ако никога досега не сте работили със скрипт за черупки, трябва да започнете с най-простия случай. Това ще ви позволи да практикувате ключови концепции, включително създаването на скрипта и неговото изпълнение.

instagram viewer

Първо, създайте следния файл на удобно място (в идеалния случай отворете терминал и първо отидете до желаната директория):

#! / bin / bash
ехо "Здравей, свят"

Първият ред казва каквото и да изпълнява тази програма как да я стартира (т.е. с помощта на интерпретатора на bash). Втората е просто команда като всяка друга, която можете да въведете в командния ред. Запазете този файл като здравей_свят.ш, тогава:

$ chmod + x hello_world.sh
$ ./hello_world.sh

The chmod команда на първия ред прави файла изпълним, което означава, че може да се стартира чрез въвеждане на името му, както във втория ред.

Ако видите, че думите „Здравей, Свят“ се появяват отпечатани на ред в терминала ти, значи всичко работи според изискванията.

Как работят цикли

Като цяло програмирането има два основни типа for цикъл: числови и за всеки. Цифровият тип е традиционно най-често срещаният, но при използването на bash обикновено е обратното.

Числовите за цикли обикновено се фокусират върху едно цяло число, което определя колко итерации ще бъдат извършени, например:

за (i = 0; i <100; i ++) {
/ * оператори за многократно изпълнение * /
}

Това е познат търсещ цикъл, който ще повтори точно 100 пъти, освен ако i не бъде променен в рамките на цикъла или друг оператор причини спиране на изпълнението на цикъла for.

Циклите Foreach, за разлика от тях, са склонни да работят върху структури като списъци или масиви и итерират за всеки елемент в тази колекция:

хора = ["Петър", "Павел", "Мария"]
foreach (хората като човек) {
if (person == "Paul") {
...
}
}

Някои езици използват малко по-различен синтаксис, който разменя реда на събиране и елемента:

хора = ["Петър", "Павел", "Мария"]
за (човек в хората) {
if (person == "Paul") {
...
}
}

За в цикли

В bash, foreach - или за в— Луп е по-често срещан. Основният синтаксис е просто:

за аргумент в [списък]
направете
/ * оператори за многократно изпълнение * /
/ * стойността на arg може да бъде получена с помощта на $ arg * /
Свършен

Например, за да прегледате три файла с изрично име:

за файл в one.c two.c three.c
направете
ls "$ файл"
Свършен

Ако такива файлове съществуват в текущата директория, изходът от този скрипт ще бъде:

един.в
две.в
три.в

Вместо фиксиран набор от файлове, списъкът може да бъде получен чрез глобален шаблон (такъв, включващ заместващи символи - специални символи, които представляват други символи). В следващия пример цикълът for итерира всички файлове (в текущата директория), чиито имена завършват на ".xml":

за файл в * .xml
направете
ls -l "$ файл"
Свършен

Ето някои примерни резултати:

$ -rw-r - r-- 1 боби персонал 2436 3 ноември 2019 feed.xml
$ -rw-r - r-- 1 боби персонал 6447 27 октомври 16:24 sitemap.xml

Това може да изглежда много като дългосрочен начин на правене:

$ ls -l * .xml

Но има съществена разлика: цикълът for изпълнява ls програма 2 отделни пъти, като всеки път се предава едно име на файл. В отделния пример ls шаблонът glob (* .xml) съвпада първо с имената на файлове и след това изпраща всички като отделни параметри на командния ред до един екземпляр на ls.

Ето пример, който използва тоалетна програма (преброяване на думи), за да направи разликата по-очевидна:

$ wc -l * .xml
44 feed.xml
231 sitemap.xml
Общо 275

The тоалетна програмата отчита броя на редовете във всеки файл поотделно, след което отпечатва общ брой във всички тях. За разлика от това, ако тоалетна работи в рамките на цикъл for:

за файл в * .xml
направете
wc -l $ файл
Свършен

Все още ще виждате броя на всеки файл:

44 feed.xml
231 sitemap.xml

Но няма общо обобщение, тъй като тоалетна се изпълнява изолирано, всеки път, когато цикълът се повтори.

Когато списъкът не е списък

Има много лесна и често срещана грешка при работа с цикли, поради начина, по който bash обработва цитираните аргументи / низове. Циклирането на списък с файлове трябва да се извършва по следния начин:

за файл в one.c two.c

Не така:

за файл в "one.c two.c"

Вторият пример затваря имената на файловете в двойни кавички, което води до списък само с един параметър; цикълът for ще се изпълни само веднъж. Този проблем може да бъде избегнат, като се използва променлива в такива случаи:

ФАЙЛОВЕ = "one.c two.c"
за файл в $ FILES
направете
...
Свършен

Имайте предвид, че самата декларация на променливата трябва да затвори стойността си в двойни кавички!

За Без списък

Без нищо за итерация, цикълът for работи с каквито и да е аргументи на командния ред, предоставени на скрипта при извикване. Например, ако имате скрипт с име args.sh съдържащи следното:

#! / bin / sh
за
направете
echo $ a
Свършен

След това изпълнението на args.sh ще ви даде следното:

$ ./args.sh една две три
един
две
три

Баш разпознава този случай и лекува за направете като еквивалент на за в $ @ do където $ @ е специална променлива, представляваща аргументи от командния ред.

Емулиране на традиционно числово за цикъл

Bash скриптовете често се справят със списъци с файлове или редове от други команди, така че цикълът for in е често срещан. Въпреки това традиционната операция в стил c все още се поддържа:

за ((i = 1; i <= 5; i ++))
направете
ехо $ i
Свършен

Това е класическата форма с три части, в които:

  1. променлива се инициализира (i = 1), когато цикълът се срещне за първи път
  2. цикълът продължава, докато условието (i <= 5) е вярно
  3. всеки път около цикъла променливата се увеличава (i ++)

Итерацията между две стойности е достатъчно често срещано изискване, за да има по-кратка, малко по-малко объркваща алтернатива:

за i в {1..5}
направете
ехо $ i
Свършен

Разширяването на скобата, което се извършва, ефективно превежда горното за цикъл в:

за i в 1 2 3 4

По-фино управление на контура с прекъсване и продължаване

По-сложните за цикли често се нуждаят от начин за излизане рано или незабавно рестартиране на основния цикъл със следващата стойност на свой ред. За да направи това, bash заема прекъсването и продължаването на изявления, които са често срещани в други езици за програмиране. Ето пример, който използва и двете, за да намери първия файл с дължина над 100 знака:

#! / bin / bash
за файл в *
направете
ако [! -f "$ файл"]
тогава
echo "$ file не е файл"
продължи
fi
num_chars = $ (wc -c echo $ файлът е "$ num_chars символи дълъг"
ако [$ num_chars -gt 100]
тогава
echo "Намерен $ файл"
почивка
fi
Свършен

Цикълът for работи тук за всички файлове в текущата директория. Ако файлът не е обикновен файл (напр. Ако е директория), операторът continue се използва за рестартиране на цикъла със следващия файл на свой ред. Ако това е обикновен файл, вторият условен блок ще определи дали съдържа повече от 100 знака. Ако е така, изразът break се използва за незабавно напускане на цикъла for (и достигане до края на скрипта).

Заключение

Bash скриптът е файл, съдържащ набор от инструкции, които могат да бъдат изпълнени. Цикълът for позволява част от скрипта да се повтаря многократно. С използването на променливи, външни команди и команди break and continue, bash скриптовете могат да прилагат по-сложна логика и да изпълняват широк спектър от задачи.

електронна поща
Етикетите за поверителност на приложенията на Apple може да не са напълно точни

Докладът предполага, че етикетите за поверителност на приложенията на Apple може да имат някои проблеми.

Свързани теми
  • Програмиране
  • Linux
За автора
Боби Джак (19 статии публикувани)

Боби е технологичен ентусиаст, който работи като разработчик на софтуер в продължение на почти две десетилетия. Той е запален по игрите, работи като редактор на рецензии в списание Switch Player и е потопен във всички аспекти на онлайн публикуването и уеб разработката.

Още от Боби Джак

Абонирайте се за нашия бюлетин

Присъединете се към нашия бюлетин за технически съвети, рецензии, безплатни електронни книги и ексклузивни оферти!

Още една стъпка…!

Моля, потвърдете имейл адреса си в имейла, който току-що ви изпратихме.

.