Svoboda | Graniru | BBC Russia | Golosameriki | Facebook
Transfiguration pending
Jump to content

Մասնակից:Aghavni.Tovmasyan/drafts

Վիքիպեդիայից՝ ազատ հանրագիտարանից
Bash
Նախագծումը՝Բրաեն Ֆոքս 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

Ծանոթագրություններ[խմբագրել | խմբագրել կոդը]

  1. 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).»
  2. Bill McCarty, Learning Debian GNU/Linux / Conquering the BASH Shell
  3. Bash Reference Manual
  4. BashGuide/TestsAndConditionals — Greg’s Wiki