Igorka Лекция #23 - баш
Малко за всичко и всичко за малко, или практическият опит на системен администратор.
" Но аз | януари » | |||||
1 | 2 | 3 | 4 | 5 | 6 | |
7 | 8 | 9 | 10 | единадесет | 12 | 13 |
14 | 15 | 16 | 17 | 18 | 19 | 20 |
21 | 22 | 23 | 24 | 25 | 26 | 27 |
28 | 29 | тридесет | 31 |
Лекция #23 - bash. Комбиниране на екипи
В този урок продължаваме да изучавамеbash. Днес ще говорим за комбиниране на команди вbash, конструкциятаcase и някои други команди. Но първо за конструкционнияслучай, незаслужено забравен на последната лекция.
case е по-удобно да се използва за разклоняване, когато дадена стойност трябва да бъде проверена за точно съвпадение и може да приеме три или повече стойности. Вместоcase, може да се използваif, но такива конструкции изглеждат тромави и не са толкова удобни за „четене“ в скриптове.
Общият синтаксис за командатаcase е както следва:
За насcase също е важен, защото се съдържа във всички скриптове в директорията/etc/init.d/. Букви, цифри, низове и модели от формата[a-z],[1-9], както и? - всеки един символ и* - всяка комбинация може да бъде зададена като шаблон. Въпреки че моделът е даден в скоби в общия синтаксис, на практика е допустимо първата скоба да бъде пропусната. Нека да разгледаме практически пример:
Използваната тук стойност е конструкцията$1, която съдържа първатапараметър, предаден на скрипта. В миналата лекция казахме, че параметрите могат да се предават не само на функциите, но и на скрипта. Стойността започва да се проверява спрямо шаблоните отгоре надолу и веднага щом бъде намерено съвпадение, ще бъде изпълнен блок от команди между шаблона и;;. Пример за скрипт:
/linux$ . /case.sh a a b c d igor @ adm-ubuntu:
/linux$ . / case.sh k Това е буквата k igor @ adm-ubuntu:
/linux$ . / case.sh qq Това са всеки два знака igor @ adm-ubuntu:
/linux$ . / case.sh 1 Това е числото 1 igor @ adm-ubuntu:
/linux$ . /case.sh start Тази дума е стоп или рестартиране или стартиране
Директорията/etc/init.d/ съдържа скриптове за управление наLinux услуги. С помощта наcase те реализират механизъм за обработка на параметрите, предадени на скрипта:start,stop,restart,reload и други. По-долу е даден фрагмент от скрипта/etc/init.d/reboot :
Ще намерите подобенcase във всеки скрипт в директорията/etc/init.d/.
Комбиниране на екипи
Вече казах, че ако напишем две ключови думи с произволна конструкция в един ред на скрипта, тогава те трябва да бъдат разделени със символа;. Точката и запетая е най-простият начин за комбиниране на команди (ключовите думиbash също се третират като команди). Командите, написани по този начин, ще бъдат изпълнени последователно, независимо от резултата от предишната команда. Примерите по-долу могат да бъдат въведени както в командния ред, така и в скрипт.
/ linux$ a = 127 ; ехо $a ; b=172; ехо $b ; нека c = $a + $b; echo $c 127 172 299
Както можете да видите от примера, има 6 команди на един ред, които са изпълнени последователно.
За паралелно движениекомандите използват познатия амперсанд&. Такива команди ще се изпълняват във фонов режим и ще се изпълняват паралелно.
$ сън 10 & сън 10 & ехо Здравейте! [ 1 ] 8043 [ 2 ] 8044 Здравейте!
Следват още интересни дизайни. След изпълнението си всяка команда връща цифров код на резултата от изпълнението на командата. Ако е 0, тогава командата е изпълнена успешно, ако това число е различно от нула, тогава командата е приключила с грешка. Можете да изградите изпълнението на последователност от команди, дадени в този момент. За да направите това, има следните елементи: двоен амперсанд -&& и двойна "тръба" -. Ако командите са комбиниранисамо до&&, тогава всяка следваща команда ще бъде изпълнена само ако предишната команда е успешна. Веднага щом която и да е команда във веригата върне код за връщане, различен от нула, командите след нея няма да бъдат изпълнени. Например, нека използваме командитеtrue (винаги връща 0) иfalse (винаги връща 1).
$true && ехо "1" && невярно && ехо "2" 1
В примера командатаtrue върна 0 и следващата командаecho “1″ беше изпълнена и също върна 0, след което беше изпълнена командатаfalse, която върна 1 и изпълнението на командите спря (командаecho 2 не беше изпълнена).
Командата работи точно обратното. Тоест, следващата команда ще бъде изпълнена само ако предишната команда е върнала ненулев код за връщане (правилото е валидно в тази форма, ако всички команди са комбинирани само ). Ако командата върне 0, тогава изпълнението на следващата верига от команди се прекъсва. Ако в горния пример заместим&& до, тогава ще бъде изпълнена само командатаtrue, която ще върне 0 и няма да бъдат изпълнени други команди. Ако заменимtrue сfalse, получаваме същия резултат:
$ фалшиво ехо "1" фалшиво ехо "2" 1
Като комбинирате&& и, можете да изградите доста сложни комбинации от команди. Но в този случай трябва да разберете по-задълбочено как се изпълняват команди с такава комбинация.
Помислете за два примера за комбиниране на команди и резултата от тяхното изпълнение:
$ false echo "1" false echo "2" 1 igor @ ubuntu:
$ false echo "1" false && ехо "2" 1 2
В първия вариант командатаfalse ще върне код 1 и ще бъде изпълнена следващата командаecho “1″, която ще върне кода за изпълнение 0. След това командната верига се прекъсва, както е описано по-горе. Във втория случай трябва да е същата ситуация, но се изпълнява командатаecho “2″. Цялата работа е, че това, което всъщност се случва, е тест навсички съюзни оператори, които участват във веригата. Ако командата е върнала 1 и всички следващи оператори за обединение са&&, тогава няма да бъде изпълнена команда. Но ако във веригата се срещне оператор, тогава командата след него ще бъде изпълнена и проверката ще продължи по-нататък.
Нека разгледаме по-отблизо тази верига:
1) Командатаfalse се изпълнява и връща кода за изпълнение 1 2) Следва операторът, което означава, че следващата команда ще бъде изпълнена 3) Командатаecho “1″ се изпълнява и връща кода 0 4) Следва операторът, което означава, че следващата команда няма да бъде изпълнено 5) Следващият оператор е маркиран - това е операторът&& означава следната команда(echo “2″ ) ще бъде изпълнено.
Вижте още няколко примера:
$ true echo "1" && фалшиво ехо "2" 2