Bash (Bourne Again Shell) е команден ред и скриптов език в GNU/Linux операционни системи. Това е обвивката по подразбиране за повечето дистрибуции на Linux.
Подобно на повечето скриптови езици, Bash предоставя синтаксис на цикъл за повтаряне на подобни задачи няколко пъти. В тази статия ще научим как да използваме за
цикъл в Bash.
Въведение
Типичният Bash скрипт съдържа серия от команди, които трябва да се изпълняват една след друга. Променливите могат да се използват за съхраняване на низове, стойности на целочислени индекси, резултати от команда и т.н. Циклите са необходими, когато потребителят иска да изпълни конкретна команда няколко пъти. Това е особено полезно, когато изходът на една команда е под формата на списък и на всеки резултат в списъка трябва да се изпълни втора команда.
Общ синтаксис
Общият синтаксис за за
цикълът в Bash е:
за in do ... ... готово
Ето, е променлива Bash, която трябва да бъде валидно име на променлива на обвивката на Linux, т.е. името съдържа комбинация от букви (az, AZ), числа (0-9) и долно черти ( _ ) и трябва да започва с буква или долна черта.
В е или персонализиран диапазон от цели числа, които ще бъдат зациклени, или персонализиран списък от цели числа или низове. Може да съдържа и друга Linux команда, но изходът на такава команда трябва да бъде разделен с интервали или знаци за нов ред, т.е. да се анализира от Bash в списък (списъкът в Bash е основно колекция от стойности, разделени с интервал или нов ред ).
Която и команда(и) трябва да се изпълни трябва да бъде поставена вътре направи..готово
блок.
Нека видим няколко прости примера.
Обработка на диапазон от целочислени стойности: Следният код създава директории с имена dir1, dir2, dir3 до dir10.
for i в {1..10} направете mkdir dir$i done
Приключване на списък с фиксирани стойности: Следният код отпечатва всеки низ или цяло число в дадения фиксиран списък.
for i in Hello 1 2 3 Чао! do echo $i done
Цикъл при изхода на команда: Следният код зациклява изхода на ls
и отпечатва името на всеки файл в дадения формат.
for i в `ls` do echo "Името на файла е $i" готово
Синтаксис, базиран на изрази
Базиран на изрази синтаксис, подобен на езика за програмиране C, също е възможен в Bash:
за ((Израз 1; Израз 2; Израз 3)) направи ... ... готово
Тук, Израз 1
е инициализацията на индексната променлива(и). Израз 2
е условието, при което цикълът трябва да се излезе; това условие се проверява при всяка итерация. Израз 3
определя увеличението/намаляването/модификацията на стойността на индексната променлива(и)
Следният пример просто отпечатва стойности от 0 до 4:
for ((i=0;i<5;i++)) do echo $i done
Следният пример създава безкраен цикъл, тъй като не са посочени изрази:
for (( ; ; )) do echo "Натиснете Ctrl-C, за да спрете" готово
Прекъснете и продължете
Изявление за прекъсване за условно излизане
Можем да използваме и условното изявление ако
вътре в цикъла. В ако
изявлението може да се използва с a прекъсване
оператор, за условно излизане от цикъла.
for ((i=0;i<10;i++)) do if [[ $i -eq 5 ]] then break else echo $i; е готово
Горният цикъл ще отпечата числа от 0 до 4. След това, когато стойността на i е 5, той ще излезе от цикъла. Това е особено полезно, когато трябва да излезете от цикъл, когато команда дава конкретен изход. Например, следният цикъл прекъсва, ако и когато намери празен файл.
for file in `ls` do flen=`wc -c $file` if [[ "$flen" = "0 $file" ]] then echo "$file is empty" break else echo $flen fi done
Командата wc -c
отпечатва броя на редовете във файла . Отпечатва го във формат
, например,
10 test.txt
. Излизаме от цикъла, когато броят на редовете е 0, т.е. празен файл.
Инструкция Continue за пропускане на итерация условно
Подобно на C и много други езици за програмиране, bash също има a продължи
оператор, за да пропуснете останалата част от итерация в цикъл, ако определено условие е изпълнено.
за ((i=0;i<10;i++)) направете, ако [[ $i -eq 5 ]] след това продължете fi echo $i; Свършен
Горният цикъл ще отпечата числа от 0 до 10, с изключение на 5, тъй като по време на итерацията на i=5
има оператор за продължаване, който ще пропусне останалата част от кода в цикъла в началото с итерацията на i=6
.
В следващия пример ние отпечатваме броя на редовете във файл и конкретна итерация ще го направи продължи
ако е директория, а не файл.
за файл в `ls` направете ако [[ -d $file ]] след това продължете fi wc -c "$file" готово
[[ -d $file ]]
проверява дали файлът е директория. Ако е така, тогава преминаваме към следващия файл, т.е. следващата итерация. Ако не е директория, отпечатваме броя на редовете във файла с помощта на тоалетна
команда, както е показано и по-горе.
Използване на цикли: скриптове и команден ред
Синтаксисът на цикъла може да се използва директно в обвивката на Bash или от файл с шел скрипт. Веднъж за
синтаксисът на цикъла се въвежда в обвивката, черупката продължава подканата, за да позволи на потребителя да продължи командите, които трябва да бъдат зациклени.
В противен случай потребителят може да запише това в скриптов файл и да изпълни скриптовия файл.
В #!/bin/bash
в началото определя интерпретатора, който да се използва, когато файлът се изпълнява. Въпреки че Bash е най-често използваната обвивка в днешно време, някои потребители предпочитат черупки като zsh
, който трябва да бъде посочен на мястото на bash в началото на този файл.
За да дадете разрешения за изпълнение за този файл изпълнете:
chmod +x test.sh
накрая, за да изпълните файла, стартирайте:
./test.sh
Заключение
В за
цикълът в Bash е доста проста функция, но се използва в почти всеки вид сложен сценарий за скриптове. Изучаването му е дълъг път, независимо дали сте редовен или напреднал потребител на Linux, или започвате да се учите на автоматизация за задачи по системно администриране и DevOps.