Մասնակից:Aghavni.Tovmasyan/drafts
Նախագծումը՝ | Բրաեն Ֆոքս Brian Fox (ծրագրավորող) |
---|---|
Գրված է՝ | C |
Առկա է | Անգլերեն, Բազմալեզու |
Պլատֆորմ | GNU |
Արտոնագիր | GNU GPL v3+[1] |
Կայք | gnu.org/software/bash |
բաշ (անգլ.՝ Bourne again shell, «Born again» shell — «վերածնված» shell) — Bourne shell հրամանների թաղանթի բարելավված և արդիականացված տարատեսակն է: Հրամանային թաղանթի առավել ժամանակակից տարածված: Հատկապես տարածված է Linux միջավայրում, որտեղ այն հաճախ օգտագործվում է որպես նախասահմանված հրամանային թաղանթ:
Բաշ-ը հրամանային պրոցես է, որը որպես կանոն աշխատում է տեքստային պատուհանի ինտերակտիվ ռեժիմում: Բաշը կարող է նաև ֆայլից հրամաններ կարդալ, որը կոչվում է սկրիպտ (կամ սցենար): Ինչպես բոլոր Unix-թաղանթները, այն ապահովվում է ֆայլերի և թղթապանակների անունների ինքնալրացում, հրամանների, փոփոխականների արդյունքների ելքի փոխարինում, հրամանների կատարման հերթականության վերահսկում, ցիկլերի և ճյուղավորման օպերատորներ: Բանալային բառերը, շարահյուսությունը և այլ լեզվի այլ առանձնահատկություններ փոխառնվել են sh. Այլ ֆունկցիոնալությունները, օրինակ, պատմությունը, պատճենվել են csh և ksh. Բաշը հիմնականում բավարարում է POSIX ստանդարտին, սակայն մի շարք հավելյալ ընդլայնումներով: [2].
<<Բաշ>> անվանումը հանդիսանում է հապավում Bourne-again-shell(«Բորնի-ևս-մեկ-հրամանային-թաղանթ>>, ռուս.՝ և իրենից ներկայացնում է բառախաղ: Bourne-shell — UNIX (sh) հրամանային թաղանթի տարածված տարատեսակներից մեկը, որի հեղինակը համարվում է Ստիվեն Բորն (1978), կատարելագործվել է 1987թ.-ին Բրայան Ֆոկս կողմից: Բորն ազգանունը համահունչ է անգլերեն born բառի հետ, ինչը թարգմանաբար նշանակում է "ծնված", այստեղից էլ "վերստին-ծնված-հրամանային թաղանթ":
2014թվականին բաշ-ում հայտաբերվել է լայնորեն շահագործվող Bashdoor խոտան (անգլ.՝ bug):
Տարբերություն շարահյուսության մեջ[խմբագրել | խմբագրել կոդը]
Bourne հրամանային պրոցեսորի կարևոր սկրիպտների ճնշող մեծամասնությունը իրականացվում է bash-ում առանց փոփոխությունների, բացառությամբ այն սկրիպների, որոնք հղվում են Bourne հատուկ փոփոխականների վրա կամ օգտագործում են Bourne ներդրված հրամանները: Bash -ի հրամանների շարահյուսությունը նիր մեջ ներառում է Korn shell (ksh) և C shell (csh) փոխառնված գաղափարներ, ինչպիսիք են հրամանային տողի խմբագրումը, հրամանների կատարման հիշողությունը, կատալոգների ստեկ, $RANDOM
և $PPID
փոփոխականները, $(…)
հրամանի փոխարինման շարահյուսություն: Երբ Bash օգտագործվում է որպես ինտերակտիվ հրամանային պրոցեսոր, այն ապահովում է ծրագրերի անունների, ֆայլերի, փոփոխականների ինքնալրացում Կաղապար:Key ստեղնի օգնությամբ:
Ներքին հրամաններ[խմբագրել | խմբագրել կոդը]
Մուտք-ելք | |
---|---|
echo |
արտապատկերում է արտահայտության կամ փոփոխականի արժեքը (stdout-ում) |
printf |
ֆորմատավորված ելքի հրաման, echo հրամանի ընդլայնված տարբերակն է
|
read |
«կարդում» է փոփոխականի արժեքը ստանդարտ մուտքից (stdin), ինտերակտիվ ռեժիմում դա ստեղնաշարն է |
Ֆայլային համակարգ | |
cd |
փոխում է ընթացիկ թղթապանակը |
pwd |
վերադարձնում է ընթացիկ աշխատանքային թղթապանակի անվանումը (անգլ.՝ print working directory) |
Փոփոխականների հետ գործողություններ | |
let |
իրականացնում է փոփոխականների հետ թվաբանական գործողություններ |
eval |
հրամանների ցուցակից գեներացնում է արգումենտների ցուցակը |
set |
փոփոխում է սկրիպտի ներքին պարամետրերի արժեքը |
unset |
ջնջում է փոփոխականը (փաստացիորեն վերագրում է փոփոխականին "null" արժեք) |
export |
արտահանում է փոփոխականը՝ հասանելի դարձնելով դուստր պրոցեսներին |
declare , typeset |
դնում կամ հանում են փոփոխականների վրա սահմնափակումներ |
getopts |
օգտագործվում է սկրիպտի հրամանի տողին փոխանցվախ արգումենտները վերլուծության համար |
Սցենարի ղեկավարում | |
source , . (точка) |
տրված սցենարի սկիզբ |
exit |
սցենարի աշխատանքի անվերապահ ավարտ |
exec |
փոխարինում է ընթացիկ պրոցեսը նոր՝ exec ՝ հրամանով ստեղծված, պրոցեսով
|
shopt |
հնարավարություն է տալիս տեղում փոխել թաղանթի բանալային հատկությունները |
Հրամաններ | |
true |
վերադարձնում է ավարտի կոդ զրո (հաջող ավարտ) |
false |
վերադարձնում է ավարտի կոդը, որը վկայում է ձախողում |
type prog |
ցուցադրում ամբողջական ուղին դեպի prog |
hash prog |
հիշել ուղին դեպի prog |
help COMMAND |
ցուցադրում է ներքին COMMAND հրամանի օգտագործման հակիրճ ուղեցույց |
Սկրիպներ[խմբագրել | խմբագրել կոդը]
Ամենապարզ դեպքում, սկրիպտ — հրամանների պարզ ցուցակ, գրված ֆայլի մեջ: Հրամանի պրոցեսորը պետք է իմանա, որ ինքը այդ ֆայլը պետք է մշակի, այլ ոչ թե կարդա նրա պարունակությունը: Ոստի, գոյություն ունի հատուկ կոնստրուկցիա, այպես կոչված Для этого служит специальная конструкция, называемая Կաղապար:Translation: #!
. #
սիմվոլը սահմանում է մեկնաբանություններ, բայց տվյալ դեպքում shebang նշանակում է, որ այս հատուկ սիմվոլից հետո գտնվում է ուղի դեպի ինտերպրետատոր սցենարի կատարման համար:
Շարահյուսություն[խմբագրել | խմբագրել կոդը]
bash հրամանի շարահյուսությունը դա Bourne shell հրամանի ընդլայնված շարահյուսությունն է: Bash հրամանանի ամբողջական դասակարգումը գտնվում է Bash Reference Manual՝ GNU ծրագրի կողմից տարածվող: [3]
«Hello world»[խմբագրել | խմբագրել կոդը]
#!/usr/bin/env bash
echo "Hello World!"
Վերը նշված սկրիպտը պարունակում է երկու տողեր: Առաջին տողը հաղորդում է համակարգին թէ ինչ ծրագիր է օգտագործվում ֆայլի թողարկման համար: Երկրորդ տողը դա այս սկրիպտի կողմից միակ կատարվող գործողությունն է, որը, ըստ էության, տերմինալում տպում է 'Hello world!':
Սկրիպտի թողարկում[խմբագրել | խմբագրել կոդը]
Որպիսի սկրիպտը գործածվող դառնա, հետևյալ հրամանները կարող են օգտագործվել.
chmod +rx scriptname # կամայական օգտագործողին տրվում է կարդալու/կատարման իրավունք
chmod u+rx scriptname # միայն սկրիպտի "տիրոջ" տրվում է կարդալու/կատարման իրավունք
Անվտանգության նկատառումներից ելնելով՝ ընթացիկ թղթապանակի «.
» ուղին ներառված չէ միջավայրի փոփոխականի $PATH
մեջ: Ուստիև սկրիպտի թողարկման համար անհրաժեշտ է նշել ճանապարհը դեպի ընթացիկ թղթապանակը, որում գտնվում է սկրիպտը.
./scriptname
Բացի այդ, նման ֆայլвывод ը կարելի է ուղղակիորեն փոխանցել Bash կատարման համար՝ օգտագործելով bash
հրամանը.
bash scriptname
Այս դեպքում չկա անհրաժեշտություն ոչ հասանելիության իրավունքի տեղադրում, ոչ էլ կոդի մեջ #!
հաջորդականության օգտագործումը:
Մուտքի-ելքի վերահղում[խմբագրել | խմբագրել կոդը]
bash -ում գոյություն ունեն ներդրված ֆայլային բնութագրիչներ. 0 (stdin), 1 (stdout), 2 (stderr):
- stdin — ստնադարտ մուտք: Այն ինր օգտագործողը հավաքում է կոնսոլի պատուհանում:
- stdout — ծրագրի ստանդարտ ելք:
- stderr — սխալների ստանդարտ դուրս բերում
Վերը թվարկած բնութագրիչների հետ աշխատելու համար գոյություն ունեն հատուկ սիմվոլներ. >
Для операций с этими дескрипторами, существуют специальные символы: >
(ելքի վերահղում), <
(մուտքի վերահղում): &
սիմվոլը տալիս է բնութագրիչի համարը; օրինակ, 2>&1
— 2 (stderr) բնութագրիչը վերահղում 1 (stdout) բնութագրիչի վրա:
0<filename <filename |
Ֆայլից մուտքի վերահղում filename
|
1>filename >filename |
«filename» անունով ֆայլի մեջ ելքի վերահղում, ֆայլը գրվում է իրեն տրվող տվյալներով |
1>>filename >>filename |
«filename» անունով ֆայլի մեջ ելքի վերահղում, տվյալները ավելացվում են ֆայլի վերջում |
2>filename |
Սխալների ստանդարտ արտատպումը «filename» անունով ֆայլի մեջ |
2>>filename |
Սխալների ստանդարտ վերահղումը «filename» անունով ֆայլի մեջ, տվյալներն ավելացվում են ֆայլի վերջում |
&>filename |
Ելքի և սխալների վերահղումը «filename» ֆայլի մեջ |
2>&1 |
Սխալներ արտատպման վերահղումը ստանդարտ ելք |
Bash -ը ունի վերահղման յուրատիպ շարահյուսություն, Bourne shell-ում չի ապահովվում: Ստանդարտ ելքի և ստանդարտ սխալների միաժամանակ վերահղման օրինակ:
command &> file
ինչն ավելի հեշտ է հավաքել, քան համարժեք հրամանը Bourne shell սինտաքսում:
command > file 2>&1
Սկրիպտի կոդից վերահղում[խմբագրել | խմբագրել կոդը]
Ապահովվում է heredoc-синтаксис:
հրաման <<MYDOC123
բազմատող տեքստ
MYDOC123
Սկսած 2.05b տարբերակից, bash -ը կարող է տողից վերահղել ստանդարտ ելքը՝ օգտագործելով հետևյալ սինտաքսը. «here strings»:
command <<< "string to be read as standard input"
Եթե տողը պարունակում է պրոբելներ, այն անհրաժեշտ է վերցնել չակերտների մեջ:
Պրոցեսի վերահղումը[խմբագրել | խմբագրել կոդը]
Օրինակ (ստանդարտ ելքի, տվյալների գրանցման, ֆայլի փակումը, stdout զրոյացման վերահղում դեպի ֆայլ).
# make Filedescriptor(FD) 6 a copy of stdout (FD 1)
exec 6>&1
# open file "test.data" for writing
exec 1>test.data
# produce some content
echo "data:data:data"
# close file "test.data"
exec 1>&-
# make stdout a copy of FD 6 (reset stdout)
exec 1>&6
# close FD6
exec 6>&-
Ֆայլերի բացում և փակում.
# open file test.data for reading
exec 6<test.data
# read until end of file
while read -u 6 dta
do
echo "$dta"
done
# close file test.data
exec 6<&-
Подстановка вывода команд[խմբագրել | խմբագրել կոդը]
Захват вывода внешних команд:
# выполнить 'date' и поместить результат в VAR
VAR=$(date)
echo "$VAR" #выведет дату на момент вызова предыдущей строки
Պայմանի օպերատոր[խմբագրել | խմբագրել կոդը]
#!/usr/bin/env bash
T1='foo'
T2='bar'
if [[ $T1 == "$T2" ]]; then
echo 'condition is true'
else
echo 'condition is false'
fi
Ուշադրություն դարձրեք, որ ձախ մասում չակերտները պարտադիր չեն: [4]
Ցիկլեր[խմբագրել | խմբագրել կոդը]
#!/usr/bin/env bash
for i in {1..10};
do
echo "$i"
done
#!/usr/bin/env bash
COUNTER=0
while [[ $COUNTER -lt 10 ]]; do
echo The counter is $COUNTER
let COUNTER=COUNTER+1
done
#!/usr/bin/env bash
i=0
until [[ $i -eq 10 ]]
do
echo "$i"
i=$[$i+1]
done
#!/usr/bin/env bash
#~ կրկնակի կլոր փակագծերի մեջ փոփոխականները կարելի է գրել C ոճով (առանց $ նշանի և օպերատորներն ու օպերանդները տարանջելով պրոբելներով)
for (( i = 0; i < 10; i++ )); do
echo -n "$i; "
done
Զանգվածներ[խմբագրել | խմբագրել կոդը]
BASH-ում իրականացված են միայն միաչափ զանգվածներ: Ինդեքսները կարող են լինել ինչպես ամբողջաթիվ(այս դեպքում զանգվածն իրենից ներկայացնում է վեկտոր), այնպես էլ տողեր(ասոցիատիվ զանգվածներ և հեշ անգլ.՝ hesh):
Չնայած վեկտորների և ասոցիատիվ զանգվածների հետ աշխատելու համար սինտաքսի եզակիացմանը, վեկտորները չեն համարվում ասոցիատիվ զանգվածների տարատեսակ ոչ վերջնական օգտագործողի տեսանկյունից, ոչ էլ հենց ինտերպրետատորի ներքին տրամաբանության տեսանկյունից: Որպես ասոցիատիվ բանալիների ապահովվման բնական հետևանք, Bash-ում գոյություն ունի բազմաչափ զանգվածների էմուլյացիայի խիստ սահմանափակ հնարավորություն:
Ընդհանուր օպերացիաներ[խմբագրել | խմբագրել կոդը]
Ստանալ տող, որը կազմված է զանգվածի տարրերից՝ անջատված պրոբելներով:
values=${arr[@]}
Ստանալ տող զանգվածի բոլոր ինդեքսներով, անկախ նրանից ինդեքսները թվային են թե տողային:
keys=${!arr[@]}
Իրականցնել համատարած փոխարինում միայն առաջին հադիպաշ «MAY» ենթատող «MARCH» զանգվածի բոլոր տարրերում և վերադարձնել արդյունքը՝ տարանջատված պրոբելներով
values=${arr[@]/MAY/MARCH}
Նույն բանն է, միայն թե փոխարինումը զանգվածի յուրաքանչյուր տարրում կատարվում է բոլոր հանդիպած «MAY» ենթատողերի համար:
values=${arr[@]//MAY/MARCH}
Ինդեքսավորված զանգվածների հետ գրոծողություններ[խմբագրել | խմբագրել կոդը]
Bash-ն ապահովում է միաչափ զանգվածներ: Զանգվածի տարրերը ինիցիալիզացնել կարելի my_array[xx]
տեսքով: Ինչպես նաև կարելի է ուղղակիորեն հայտարարել զանգվածը սցենարի մեջ՝ հետևյալ ուղեցույցի օգնությամբ.
declare
:
declare -a my_array
Զանգվածի առանձին տարրերին դիմել կարելի է ձևավոր փակագծերի օգնությամբ, այսիքն՝ ${my_array[xx]}
:
Ինդեքսավորված զանգվածները կարելի է ինիցիալիզացնել 2 եղանակով.
1)
Array=(element1 element2 element3)
2)
temp_array[0]=element1
temp_array[5]=element
temp_array[9]=elementN
Տարրերի ավելացում ինդեքսավորված զանգվածի վերջում.
declare -a arrAnimals
arrAnimals=(dog elephant horse cow)
# print out the array content
echo "${arrAnimals[@]}"
# adding "pig" element at the end of arrAnimals array
arrAnimals+=(pig)
# and again print out the content of the array
echo "${arrAnimals[@]}"
Ստանալ զանգվածի առաջին տարրը.
echo "${arrAnimals[0]}"
# or:
echo "${arrAnimals[@]:0:1}"
Ստանալ զանգվածի վերջին տարրը.
echo "${arrAnimals[@]:${#arrAnimals[@]}-1}"
Գործողություններ ասոցիատիվ զանգվախների հետ[խմբագրել | խմբագրել կոդը]
Սկսած 4.0 տարբերակից Bash -ում հայտնվել են ասոցիատիվ զանգվածներ (այսպես կոչված hash-զանգվածներ): Ասոցիատիվ զանգվածների հայտարարման համար Для объявления ассоциативных массивов используется ключ -A встроенной команды declare:
declare -A hshArray
Как и в случае с индексированными массивами, для заполнения ассоциативных массивов могут использоваться два различных синтаксиса:
1)
TheCapitalOf[Georgia]='Tbilisi'
TheCapitalOf[Australia]='Canberra'
TheCapitalOf[Pakistan]='Islamabad'
2)
TheCapitalOf=([Georgia]='Tbilisi' [Australia]='Canberra' [Pakistan]='Islamabad')
С помощью ассоциативных массивов можно имитировать поддержку многомерных массивов:
declare -A a # объявляет ассоциативный массив 'a'
i=1; j=2 # инициализация нескольких индексов
a[$i,$j]=5 # присвоение значения "5" в ячейку "$i,$j" (т.е. "1,2")
echo ${a[$i,$j]} # вывод хранимых значений из "$i,$j"
К сожалению, в текущих версиях BASH скопировать содержимое одного ассоциативного массива в другой простым присваиванием невозможно. Данную проблему можно только обойти, для чего существуют два принципиально разных подхода:
1) Эмулировать декларацию второго хеша «с нуля» путём копирования декларации первого хеша:
declare -A hsh1
hsh1=(...)
source <(declare -p hsh1 | sed 's/declare -A hsh1/declare -A hsh2/')
2) Перебрать все элементы хэша-источника и скопировать их в целевой хеш:
declare -A hsh1 hsh2
hsh1=(...)
for k in ${!hsh1[@]}; do
hsh2[$k]=${hsh1[$k]}
done
Ծանոթագրություններ[խմբագրել | խմբագրել կոդը]
- ↑ GNU Project. «README file». «Bash is free software, distributed under the terms of the [GNU] General Public License as published by the Free Software Foundation, version 3 of the License (or any later version).»
- ↑ Bill McCarty, Learning Debian GNU/Linux / Conquering the BASH Shell
- ↑ Bash Reference Manual
- ↑ BashGuide/TestsAndConditionals — Greg’s Wiki