Писане на скриптове за bash шел : версия 2( част 1)



страница1/3
Дата14.09.2016
Размер298.9 Kb.
#9732
  1   2   3
Писане на скриптове за BASH шел : версия 1.2( част 1)

Тази статия е преведена с разрешението на автора и X_console.


Адресът на оригиналната статия е http://xfactor.itec.yorku.ca/~xconsole/.

Както всички шелове, който може да намерите за Linux BASH (Bourne Again SHell) е не само отличен команден интерпретатор но и език за писане на криптове. Шел(Shell) скриптовете ви позволяват максимално да използвате възможностите на шел интерпретатора и да автоматизирате множество задачи. Много от програмите, който може да намерите за Linux в последно време са шел скриптове. Ако искате да разберете как те работят или как може да ги редактирате е важно да рабирате синтаксиса и семантиката на BASH шела. В допълнение познаването на bash езика ви позволява да напишете ваши собствени програми, който да изпълняват точно това което искате.



Програмиране или писане на скрипове?
Хората който до сега не са се занимавали с програмиране обикновено не разбират разликата между програмен и скрипт език. Програмните езици обикновено са по-мощни и по-бързи от скрипт езиците. Примери за програмни езици са C, C++, и Java. Програмите който се пишат на тези езици обикновено започват от изходен код (source code) - текст който съдържа инструкции за това как окончателната програма трябва да работи след което се компилират до изпълним файл. Тези изпълними файлове не могат лесно да бъдат адаптирани за различни операционни системи (ОС). Например ако сте написали програма на C за Linux изпълнимият файл няма да тръгне под Windows 98. За да можете да я използвате тази програма се налага да прекомпилирате изходния код под Windows 98. Скриптовете (програмите писани на скрипт езици) също започват от изходен, но не се компилират в изпълними файлове. При тях се изполва интерпретатор който чете инструкциите от изходния код и ги изпълнява. За жалост, поради това че интерпретатора трябва да прочете всяка команда преди да я изпълни, интерпретираните програми вървят като цяло по-бавно спрямо компилираните. Основното предимство на скриптовете се е, че лесно могат да бъдат пренаписани за други ОС стига да има интерпретатор за тази ОС. bash е скрипт език. Той е идеален за малки програми. Други скрип езици са Perl, Lisp, и Tcl.

Какво искате да знаете?

Писането на собствени шел скриптове изисква от вас да знаете най-основните команди на Linux. Трябва да знаете например как да копирате, местите или създавате нови файлове. Едно от нещата което е задължително да знаете е как да работите с текстов редактор. За Linux има множество текстови редактори най-разпространените от който са vi, emacs, pico, mcedit.



Внимание!!!
Не се упражнявайте в писане на скриптове като root потребител! Не се знае какво може да се случи! Аз няма да бъда отговорен ако вие по невнимание повредите вяшата система. Имайте това в предвид! За упражненията изполвайте нормален потребител без права на root.

Вашият първи BASH скрипт
Първият скрипт който ще напишете е класическата "Hello World" програма. Тази програма изпечатва единствено думите "Hello World" на екрана. Отворете любимия си текстов редактор и напишете:

#!/bin/bash
echo "Hello World"

Първият ред от програмата казва че ще използваме bash интерпретатора за да подкараме програмата. В този случай bash се намира в /bin директорията. Ако bash се намира в друга директория на вашата система тогава направете необходимите премени в първия ред. Изричното споменаване на това кой интерпретататор ще изпълнява скрипта е много важно, тъи като той казва на Linux какви инструкции могат да бъдат използвани в скрипта. Следващото нещо което трябва да направите е да запишете файла под името hello.sh. Остава само да направите файла изпълним. За целта пишете:



xconsole$ chmod 700 ./hello.sh

Прочетете упътването за използване на chmod командата ако не знаете как да променяте правата на даден файл. След като сте направили програмата изпълнима я стартирайте като напишете:



xconsole$ ./hello.sh

Резултатът от която ще бъде следният надпис на екрана


Hello World

Това е! Запомнете последователноста от действия - писане на кода, записване на файла с кода, и променянето на файла в изпълним с командата chmod.



Команди, Команди, Команди
Какво точно направи вашата първа програма? Тя изпечата думите "Hello World" на екрана. Но как програмата го направи това? С помоща на команди. Единственият ред с команди беше echo "Hello World". И коя е командата? echo. Командата echo изпечатва всичко на екрана, което е получила като свой аргумент.

Аргумент е всичко което е написано след името на командата. В нашият случай това е "Hello World". Когато напишете ls /home/root, командата е ls а нейният аргимент е /home/root. Какво означава всичко това? Това означава че ако имате програма или команда, която изпечатва аргументите си на екрана то може да я използвате вместо echo. Нека да предположим че имаме такава команда която се казва foo. Тази комада ще изпечата своите аргументи на екрана. Тогава нашият скрипт може да изглежда така:



#!/bin/bash
foo "Hello World"

Запишете го и го направете изпълним с chmod след което го стартирайте:



xconsole$ ./hello
Hello World

Точно същият резултат. Всичко което правихте до сега е да използвате echo командата във вашия шел скрипт. Друга команда за изпечатване е printf. Командата printf позволява повече контрол при изпечатване на информацията, особено ако сте запознати с програмния език C. Фактически съшият резултат от нашият скрипт можем да постигнем просто ако напишем в командния ред:



xconsole$ echo "Hello World"
Hello World

Както виждате може да използвате Linux команди при писането на шел скриптове. Вашият bash шел скрипт е колекция от различни програми, специално написани заедно за да изпълнят конкретна задача.



Малко по-лесни програми
Сега ще напишем програма с която да преместим всички файлове от дадена директория в нова директория, след което ще изтрием новата директория заедно със нейното съдържание и ще я създадем отново. Това може да бъде направено със следната последователност от команди:

xconsole$ mkdir trash
xconsole$ mv * trash
xconsole$ rm -rf trash
xconsole$ mkdir trash

Вместо да пишем последователно тези команди можем да ги запишем във файл:



#!/bin/bash
mkdir trash
mv * trash
rm -rf trash
mkdir trash
echo "Deleted all files!"

Запишете файла под името clean.sh. След като стартирате clean.sh той ще премести всички файлове в директория trash, след което ще изтрие директорията заедно със съдържанието и ще я създаде отново. Дори ще изпечата съобщение на екрана, когато свърши със тези действия. Този пример показва и как да автоматизирате многократното писане на последователности от команди.



Коментари във скрипта
Коментарите ви помагат да направите вашата програма по-лесна за разбиране. Те не променят нищо в изпълнението на самата програма . Те се използват единствено за да може вие да ги четете. Всички коментари в bash започват със символа: "#", с изключение на първия ред (#!/bin/bash). Първият ред не е команда. Всички редове след първия който започват със "#" са коментари. Вижте кода на следния скрипт:

#!/bin/bash
# tazi programa broi chislata ot 1 do 10:
for i in 1 2 3 4 5 6 7 8 9 10; do
echo $i
done

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



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

#!/bin/bash
x=12
echo "Stoinosta na promenliwata x e $x"

Всичко което се случва е да присвоим на променливата x стойност 12 и да я отпечатаме тази стойност с комадата echo. echo "Stoinosta na promenliwata x e $x" изпечатва текущата стойност на x. Когато давате стойност на дадена променлива не трябва да има шпации между нея и "=". Ето какъв е синтаксиса:



име_на_променлива=стойност

Стойноста на променливата можем да получим като поставим символа "$" пред нея. В конкретния случай за да изпечатаме стойноста на& x пишем echo $x.

Има два типа променливи - локални променливи и променливи на обкръжението(environment). Променливите на обкръжението се задават от системата и информация за тях може да се получи като се използва env командата. Например:

xconsole$ echo $SHELL

Ще отпечата

/bin/bash

Което е името на шела който използваме в момента. Променливите на обкръжението са дефинирани в /etc/profile и ~/.bash_profile. С echo командата можете лесно да проверите текущата стойност на дадена променлива, биля тя от обкръжението или локална. Ако все още се чудите защо са ни нужни променливи следната програма е добър пример който илюстрира тяхното използване:

#!/bin/bash
echo "Stojnosta na x e 12."
echo "Az imam 12 moliwa."
echo "Toj mi kaza che stojnosta na x e 12."
echo "Az sym na 12 godini."
echo "Kak taka stojnosta na x e 12?"

Да предположим че в един момент решите да промените стойноста на x от 12 на 8. Какво трябва да направите? Трябва да премените навсяскъде в кода 12 с 8. Да но... има редове в който 12 не е стойноста на x. Трябва ли да променяме и тези редове? Не защото те не са свързани с x. Не е ли объркващо? По надолу е същия пример само че се използват променливи:



#!/bin/bash
x=12 # stoinosta na promenliwata x e 12 e x
echo "Stoinosta na x e $x."
echo "Az imam 12 moliwa."
echo "Toj mi kaza che stojnosta na x e $x."
echo "Az sym na 12 godini."
echo "Kak taka stojnosta na x e $x?"

В този пример $x ще изпечата текущата стойност на x, която е 12. По този начин ако искате да промените стойноста на x от 12 на 8 е необходимо единствено да замените реда в който пише x=12 с x=8. Другите редовете няма да бъдат променени. Променливити имат и дуги полезни свойства както ще се убедите сами в последствие.

Писане на скриптове за BASH шел : версия 1.2( част 2)

Тази статия е преведена с разрешението на автора и X_console.


Адресът на оригиналната статия е http://xfactor.itec.yorku.ca/~xconsole/.

Продължениe на [ част 1 ].



Условни оператори
Условните оператори ви позволяват вашата програма да "взема решения" и я правят по-компактна. Което е по-важно с тях може да проверявате за грешки. Всички примери до сега започваха изпълнението си от първия ред до последния без никакви проверки. За пример:

#!/bin/bash
cp /etc/foo .
echo "Done."

Тази малка шел програма копира файлът /etc/foo в текущата директория и изпечатва "Done" на екрана. Тази програма ще работи само при едно условие. Трябва да има файл /etc/foo. В противен случай ще се получи следния резултат:



xconsole$ ./bar.sh
cp: /etc/foo: No such file or directory
Done.

Както виждате имаме проблем. Не всеки който стартира вашата програма има файл /etc/foo на системата си. Ще бъде по-добре, ако вашата програма проверява дали файла /etc/foo съществува и ако това е така да продължи с копирането, в противен случай да спре изпълнението. С "псевдо" код това изглежда така:



if /etc/code exists, then
copy /etc/code to the current directory
print "Done." to the screen.
otherwise,
print "This file does not exist." to the screen
exit

Може ли това да бъде направено с bash? Разбира се! В bash условните оператори са: if, while, until, for, и case. Всеки оператор започва с ключова дума и завършва с ключова дума. Например if оператора започва с ключовата дума if, и завършва с fi. Условните оператори не са програми във вашата система. Те са вградени свойства на bash.



if ... else ... elif ... fi
Е един от най-често използваните условни оператори. Той дава възможност на програма да вземе решения от рода на "направи това ако(if) това условие е изпълнено, или(else) прави нещо друго". За да използвате ефективно условния оператор if трябва да използвате командата test. test проверява за съществуване на файл, права, подобия или разлики. Ето програмата bar.sh:

#!/bin/bash
if test -f /etc/foo
then
# file exists, so copy and print a message.
cp /etc/foo .
echo "Done."
else
# file does NOT exist, so we print a message and exit.
echo "This file does not exist."
exit
fi

Забележете че редовете след then и else са малко по-навътре. Това не е задължително, но се прави с цел програмата да бъде по-лесна за четене. Сега стартирайте програмата. Ако имате файл /etc/foo, тогава програмата ще го копира в текущата директория, в противен случай ще върне съобщение за грешка. Опцията -f проверява дали това е обикновен файл. Ето списък с опциите на командата test:



-d проверява дали файлът е директория
-e проверява дали файлът съществува
-f проверява дали файлът е обикновен файл
-g проверява дали файлът има SGID права
-r проверява дали файлът може да се чете
-s проверява дали файлът разнерът на файла не е 0
-u проверява дали файлът има SUID права
-w проверява дали върху файлът може да се пише
-x проверява дали файлът е изпълним



else се използва ако искате вашата програма да направи нещо друго, ако първото условие не е изпълнено. Има и ключова дума elif, която може да бъде използвана вместо да пишете друг if вътре в първия if. elif идва от английското "else if". Използва се когато първото условие не е изпълнено и искате да проверите за друго условие.

Ако не се чувствате комфортно с if и test синтаксиса, който е :



if test -f /etc/foo
then

тогава може да използвате следния вариант:



if [ -f /etc/foo ]; then

Квадратните скоби формират test командата. Ако имате опит в програмирането на C този синтакс може да ви се стори по-удобен. Забележете, че трябва да има разстояние след отварящата квадратна скоба и преди затварящата. Точката и запетаята: ";" казва на шела че това е края на командата. Всичко след ";" ще бъде изпълнено сякаш се намира на следващия ред. Това прави програмата малко по-четима. Можете разбира се да сложите then на следващия ред.

Когато използваме променливи с test е добре да ги заградим с кавички. Например:

if [ "$name" -eq 5 ]; then

while ... do ... done
while оператора е условен оператор за цикъл. Най-общо казано, това което прави е "while(докато) това условие е вярно, do(изпълни) командите done ". Нека да видим следния пример:

#!/bin/bash
while true; do
echo "Press CTRL-C to quit."
done


true в действителност е програма. Това което прави тази програма е да се изпълнява безкрайно. Използването на true се смята, че забавя вашата програма, защото шел интерпретатора първо трябва да извика програмата и след това да я изпълни. Вместо това може да използвате командата ":":

#!/bin/bash
while :; do
echo "Press CTRL-C to quit."
done

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



#!/bin/bash
x=0; # initialize x to 0
while [ "$x" -le 10 ]; do
echo "Current value of x: $x"
# increment the value of x:
x=$(expr $x + 1)
sleep 1
done

Както виждате използваме test (записана като квадратни скоби) за да проверим състоянието на променливата x. Опцията -le проверява дали x е по-малко(less) или равно(equal) на 10. На говорим език това се превежда по следния начин "Докато(while) x е по-малко или равно на 10, покажи текущата стойност на x, и след това добави 1 към текущата стойност на x.". sleep 1 казва на програмата да спре изпълнението си за една секунда. Както виждате това което правим тук в да проверим за равенство. Ето списък с някой опции на test:



Проверка за равенства между променливите x и y, ако променливите са числа:
x -eq y Проверява дали x е равно на y
x -ne y Проверява дали x не е равно на y
x -gt y Проверява дали x е по-голямо от y
x -lt y Проверява дали x е по-малко от y

Проверка за равенства между променливите x и y, ако променливите са текст:
x = y Проверява дали x е същитата като y
x != y Проверява дали x не е същитата като y
-n x Проверява дали x не е празен текст
-z x Проверява дали x е празен текст

От горния пример единственият ред, който може да ви се стори по-труден за рабиране е следния:



x=$(expr $x + 1)

Това което прави този ред е да увеличи стойноста на x с 1. Но какво значи $(...)? Дали е променлива? Не. На практика това е начин да кажете на шел интерпретатора, че ще изпълнявате командата expr $x + 1, и резултата от тази команда ще бъде присвоен на x. Всяка команда която бъде записана в $(...) ще бъде изпълнена:



#!/bin/bash
me=$(whoami)
echo "I am $me."

Опитайте с този пример за да разберете какво имам предвид. Горната програмка може да бъде написана по-следния начин:



#!/bin/bash
echo "I am $(whoami)."

Сами си решете кой от начините е по-лесен за вас. Има и друг начин да изпълните команда или да присвоите разултата от изпълнението на дадена команда на променлива. Този начин ще бъде обяснен по-нататък. За сега използвайте $(...).



until ... do ... done
Условния оператор until е много близък до while. Единствената разлика е, че се обръща смисъла на условието и се взима предвид новото значение. Действието на until оператора е "докато(until) това условие е вярно, изпълнявай(do) командите". Ето пример:

#!/bin/bash
x=0
until [ "$x" -ge 10 ]; do
echo "Current value of x: $x"
x=$(expr $x + 1)
sleep 1
done

Този код може би ви изглежда познат. Проверете го и вижте какво прави. until ще изпълнява командите докато стойноста на променливата x е по-голяма или равна на 10. Когато стойноста на x стане 10 цикълът ще спре. Ето защо последната стойност на x която ще се изпечата е 9.



for ... in ... do ... done
for се използва кога искате да присвойте на дадена променлива набор от стойности. Например можете да напишете програма, която да изпечатва 10 точки всяка секунда:

#!/bin/bash
echo -n "Checking system for errors"
for dots in 1 2 3 4 5 6 7 8 9 10; do
echo -n "."
done
echo "System clean."

В случай, че не знаете опцията -n на командата echo спира автоматичното добавяне на нов ред. Пробвайте командата веднъж с -n опцията и веднъж без нея за да разберете за какво става дума. Променливата dots преминава през стойностите от 1 до 10. Вижте следния пример:



#!/bin/bash
for x in paper pencil pen; do
echo "The value of variable x is: $x"
sleep 1
done

Когато стартирате програмата ще видите че x в началото ще има стойност paper, след което ще премине на следващата стойност, която е pencil, и след това pen. Когато свършат стойностите през който минава цикъла изпълненито му завършва.

Ето една доста полезна програма. Тя добавя .html разширение на всички файлове в текущата директория:

#!/bin/bash
for file in *; do
echo "Adding .html extension to $file..."
mv $file $file.html
sleep 1
done

Ако не знаете "*" е "wild card character". Това ще рече "всичко в текущата директория", което в нашия случай представлява всички файлове в тази директория. Променливата file ще премине през всички стойности, в този случай файловете в текущата директория. След което командата mv преименува стойностите на променливата file във такива с .html разширение.



case ... in ... esac
Условния оператор case е близък до if . За предпочитане е да се използва когато имаме голям брой условия който трябва да бъдат проверени. Вземете за пример следния код:

#!/bin/bash
x=5 # initialize x to 5
# now check the value of x:
case $x in
0) echo "Value of x is 0."
;;
5) echo "Value of x is 5."
;;
9) echo "Value of x is 9."
;;
*) echo "Unrecognized value."
esac

Оператора case ще провери стойност на x на коя от 3-те възможности отговаря. В този случай първо ще провери дали стойноста на x е 0, след което ще провери за 5 и 9. Накая ако никое от условия не е изпълнено ще се изпечата съобшението "Unrecognized value.". Имайте предвид, че "*" означава "всичко", и в този случай това означава "която и да е стойност различна от посочените". Ако стойноста на x е различна от 0, 5, или 9, то тогава тя попада в случая "*". Когато използвате case всяко условие трябва да завършва с две ";". Може би се чудите защо да използвате case когато може да използвате if? Ето как изглежда еквивалентната програма написана с if. Вижте коя програма е по-бърза и по лесна за четене:



#!/bin/bash
x=5 # initialize x to 5
if [ "$x" -eq 0 ]; then
echo "Value of x is 0."
elif [ "$x" -eq 5 ]; then
echo "Value of x is 5."
elif [ "$x" -eq 9 ]; then
echo "Value of x is 9."
else
echo "Unrecognized value."
fi

Писане на скриптове за BASH шел : версия 1.2( част 3)

Тази статия е преведена с разрешението на автора и X_console.
Адресът на оригиналната статия е http://xfactor.itec.yorku.ca/~xconsole/.

Продължениe на [ част 2 ].



Каталог: wp-content -> uploads -> 2014
2014 -> Роля на клъстерите за подобряване използването на човешките ресурси в малките и средни предприятия от сектора на информационните технологии
2014 -> Докладна записка от Петър Андреев Киров Кмет на община Елхово
2014 -> Биография: Цироза е траш група от град Монтана. Началото й дават Валери Геров (вокал/китара), Бойко Йорданов и Петър Светлинов (барабани) през 2002година
2014 -> Албум на Първични Счетоводни Документи 01. Фактура
2014 -> Гр. Казанлък Утвърдил
2014 -> 1. Do you live in Madrid? A
2014 -> Брашно – тип „500” седмична справка: средни цени за периода 3 10 септември 2014 Г
2014 -> Права на родителите: Да изискват и получават информация за развитието, възпитанието и здравословното състояние на детето, както и информация за програмите, по които се извършва възпитателно-образователната работа в одз№116


Сподели с приятели:
  1   2   3




©obuch.info 2024
отнасят до администрацията

    Начална страница