Igorka Лекция #23 - баш

Малко за всичко и всичко за малко, или практическият опит на системен администратор.

igorka

декември 2009 г.Пон Вт Ср Чет Пет Сб Нед
" Но азянуари »
123456
78910единадесет1213
14151617181920
21222324252627
2829тридесет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