Използване на цикъл „while“ в Bash скриптове за повторение на команда(и).
Bash (Bourne Again Shell) е команден ред и скриптов език в GNU/Linux операционни системи. Това е обвивката по подразбиране за повечето дистрибуции на Linux.
Подобно на повечето скриптови езици, Bash предоставя синтаксис на цикъл за повтаряне на подобна задача няколко пъти. В тази статия ще научим как да използваме докато
цикъл в Bash.
Въведение
В докато
цикълът в Bash се използва за изпълнение на команда(и) (изпълнени команди) няколко пъти въз основа на изхода на друга команда(и) (команди за условия). Изпълнените команди ще продължат да се изпълняват, докато командата за условие не се изпълни успешно (т.е. връща статус 0. Всяка команда в Linux връща 0 за успех и ненулево цяло число за неуспех).
Ако има множество команди за условия, операторът разглежда само състоянието на последната команда в списъка, т.е. цикълът се изпълнява, докато последната команда в списъка не се изпълни успешно.
Общ синтаксис
Общият синтаксис за докато
цикълът в Bash е:
докато направиш
Списъкът с команди за изпълнение ще продължи да работи, докато последната команда в списъка с команди за условие не се изпълни успешно и излезе със състояние 0. При итерацията, когато последната команда за условие се провали, цикълът излиза.
Потребителят може да посочи всеки изпълним файл в списъците с команди. Това могат да бъдат стандартни програми за Linux или потребителски програми или скриптове. Всяка команда трябва да бъде или на нов ред, или разделена с точка и запетая на същия ред.
Нека видим няколко примера.
Цикъл, докато променлива има определена стойност: Следващият цикъл се изпълнява до стойността на променливата х
не е равно на 10.
x=0 докато [[ $x -ne 10 ]] прави ехо $x ((x++)) готово
Във всяка итерация проверяваме дали стойността на x е 10. Стойността се проверява с помощта на тест
команда. [[ Израз ]]
е синтаксисът на тестовата команда (вж мъж тест
). Тук, тъй като използваме -не
оператор (което означава „не е равно на“), тестовата команда връща 0, т.е. успех, ако стойността на x не е 10, и връща стойност, различна от нула, т.е. неуспех, ако стойността на x е 10.
След това вътре в направи... готово
блок, отпечатваме стойността на x и я увеличаваме. След като стойността на x е 10, тестовата команда връща ненулев статус и цикълът излиза.
Забележка: Индексната променлива, която ще се използва в цикъла while, трябва да бъде инициализирана или преди цикъла while, или в командите за условие, за разлика от цикъла for, който позволява неявно инициализиране на променлива.
С множество команди за условия: Следващият цикъл създава 5 директории с име dir0, dir1, ... dir4
.
z=0 while echo "Списък с файлове:" ls -l [[ $z -ne 5 ]] do echo "Създаване на dir$z..." mkdir dir$z ((z++)) готово
Първи команди echo "Списък с файлове:"
и ls -l
ще се изпълни веднъж напълно; техният успех или неуспех няма никакво влияние върху това колко дълго ще продължи цикълът.
Тогава ще се изпълни тестовата команда за проверка на стойността на променлива z. Докато стойността на z не е 5, тестовата команда връща успешно състояние и следователно цикълът продължава да работи. Командите за условия и изпълнените команди продължават да работят в ред. Тук за всяка итерация първо ще изпълни командата echo и командата ls в условие, а след това командата за 3-то условие проверява стойността на z. Ако не е 5, той влиза в цикъла и изпълнява дадените команди.
Прекъснете и продължете
Изявление за прекъсване за условно излизане
Можем да използваме и условното изявление ако
вътре в цикъла. В ако
изявлението може да се използва с a прекъсване
оператор, за условно излизане от цикъла.
x=0 докато [[ $x -ne 10 ]] прави, ако [[ $x -eq 5 ]] прекъсва fi echo $x ((x++)) готово
Горният цикъл while ще отпечата числа от 0 до 4. След това, когато стойността на i е 5, той ще излезе от цикъла. Това е особено полезно, когато трябва да излезете от цикъл, когато команда дава конкретен изход.
Инструкция Continue за пропускане на итерация условно
Bash също има a продължи
оператор, за да пропуснете останалата част от итерация в цикъл, ако определено условие е изпълнено.
x=0 докато [[ $x -ne 10 ]] прави, ако [[ $x -eq 5 ]] продължава fi echo $x ((x++)) готово
Горният цикъл ще отпечата числа от 0 до 10, с изключение на 5, тъй като по време на итерацията на х=5
има оператор за продължаване, който ще пропусне останалата част от кода в цикъла в началото с итерацията на х=6
.
Използване на цикли: скриптове и команден ред
Синтаксисите на цикъла могат да се използват в Bash shell директно или от изпълним файл на скрипт. Подобен на за
и докато
цикли, веднъж an докато
синтаксисът на цикъла се въвежда в обвивката, черупката продължава подканата, за да позволи на потребителя да продължи командите, които трябва да бъдат зациклени.
В противен случай потребителят може да запише това в скриптов файл и да изпълни скриптовия файл.
В #!/bin/bash
в началото определя интерпретатора, който да се използва, когато файлът се изпълнява. Въпреки че Bash е най-често използваната обвивка в днешно време, някои потребители предпочитат черупки като zsh
, който трябва да бъде посочен на мястото на bash в началото на този файл.
За да дадете разрешения за изпълнение за този файл изпълнете:
chmod +x test.sh
накрая, за да изпълните файла, стартирайте:
./test.sh
Заключение
В докато
цикъл, подобен на за
и до
циклите са важна характеристика в Bash скриптовете. Докато цикълът има подобна употреба като цикъла до, с изключение на това, че се използва за изпълнение на алтернативни команди/програми, когато определена програма успее. Това често намира своята полезност в усъвършенствани мрежови скриптове, скриптове за поддръжка на системата и т.н.