თარგმნილია tutorialspoint.com-დან
დამატებითი რესურსები:
- კომპიუტერის ავტომატიზაცია
- კომპიუტერის მართვა
- პატარ-პატარა ტასკების დაჯგუფება
- უმეტესწილად უფრო ლაკონურია ვიდრე პითონი
- შეგვიძლია ასევე პითონთან ერთად გამოყენება
compgen -k
- გვიბრუნებს ჩაშენებული keyword-ების მნიშვნელობას
ყველა სკრიფტი უნდა იწყებოდეს ე.წ. shebang
-ით, რადგანაც ის მიუთითებს, თუ რომელი პროგრამის მეშვეობით უნდა გაიხსნას მის ქვემოთ დაწერილი სკრიფტი.
#!/bin/bash
იმის სანახავად თუ რომელ bash -ს იყენებს ტერმინალი (რათა შემდგომ, მივუთითოთ იგივე პროგრამა shebang-ის გვერდით) შეიძლება გამოვიყენოთ ბრძანება:
echo $SHELL
ასევე ყველა სკრიფტის ფაილის უნდა ჰქონდეს შესრულების უფლება
sudo chmod +x filename.sh
ალტერნატიულად
sudo chmod 744 filename.sh
# 7 = 4 + 2 + 1
# 4 - read
# 2 - write
# 1 - execute
.bash_profile
ავტომატურად ეშვება კომპიუტერის ჩართვისას, ან ssh -ით შესვლისას
- ეშვება მხოლოდ ერთხელ (მოწყობილობის Login -ის დროს)
- ძირითადად ამ ფაილში ინახება ცვლადი PATH (რომელიც სხვადასხვა პროგრამების მისამართებს ინახავს, რათა ისინი ხელმისაწვდომი იყვნენ ყველა მისამართიდან)
.bashrc
ავტომატურად ეშვება ახალი bash ფანჯრის გახსნისას.
- ეშვება ყოველი shell -ის გახსნისას.
- ძირითადად ამ ფაილში ინახება მოკლე დასახელებები ანუ alias
.profile
- იგივეა რაც
.bash_profile
მაგრამ მას იყენებენ სხვადასხვა პროგრამები. ისეთები როგორიც sh, ksh, bash...
ცვლადის სახელები უნდა შეცავდეს მხოლოდ [a-zA-Z0-9_] სიმბოლოებს, ცვლადის სახელებს ასევე კონვენციის მიხედვით წერენ UPPERCASE-ით
ცვლადების გამოცხადებისას მინიჭების სიმბოლოს (=) მარცხნიდან და მარჯვნიდან არ უნდა იყოს დაშორება.
NAME="David"
AGE=31
echo "Hello, my name is $NAME and I'm $AGE years old! "
NAME="David"
AGE=31
readonly NAME
echo "Hello, my name is $NAME and I'm $AGE years old! "
ასეთ შემთხვევაში სკრიფტი არაფერს დაბეჭდავს.
შეუძლებელია unset
ბრძანებით readonly
ცვლადის წაშლა
NAME="David"
unset NAME
echo $NAME
ცვლადები და გარემო
ლოკალური ცვლადები რომლებიც ჩანს მხოლოდ ერთ ფანჯერაში შეგვიძლია დავწეროთ ჩვეულებრივად
VAR="Value"
ხოლო თუ გვინდა ცვლადს სხვა ფანჯრიდანაც მივწვდეთ, მაშინ წინ უნდა მივუწეროთ keyword-ი export
:
export VAR="Value"
declare -x Var="Value"
გვაძლევს ცვლადის შექმნის საშუალებას.
declare -r Value=3
Value=1 # Error Value: readonly variable
echo $Value
declare -i number
number=1+2 # The result is 3, not the string "1+2"
declare -a myArray
myArray[0]=Hi
myArray[1]=Hey
echo ${myArray[@]}
# Declares a variable as an associative array (hash map)
declare -A myArray
myArray[0]=Hi
myArray[1]=Hey
echo ${myArray[@]}
declare -x Value # export Value
declare -l lowercase_var="This Will Be Lowercase"
declare -u uppercase_var="This Will Be Uppercase"
# | ცვლადი | აღწერა |
---|---|---|
1 | $0 | სკრიფტის ფაილის სახელი |
2 | $n | პოზიციური არგუმენტები რომლებიც გადაეცემა სკრიფტს შესრულების დროს. $1 პირველი არგუმენტია $2 მეორე და ა.შ. |
3 | $# | არგუმენტების რაოდენობა რომელიც გადაეცა სკრიფტს |
4 | $* | იღებს ყველა არგუმენტს ერთი სტრიქონის სახით |
5 | $@ | იღებს ყველა არგუმენტს ცალ-ცალკე სტრიქონებად |
6 | $? | წინა შესრულებული/დასრულებული პროგრამის დამთავრების სტატუსი |
7 | $$ | მიმდინარე shell -ის პროცესის ID |
8 | $! | ბოლო ბრძანების ნომერი რომელიც მიმდინარეობდა ფონურ რეჟიმში |
მაგალითი
იღებს ყველა არგუმენტს სტრიქონად და იყენებს "ჩანაცვლებას" იმისთვის რომ გადასცეს ყველა არგუმენტი გარდა პირველი ორისა. ( ფაილის სახელისა და პირველი არგუმენტის )
add_tag() {
echo tm add "$1" --tags "${@:2}"
tm add "$1" --tags "${@:2}"
}
myarray=("one" "two" "three")
myarray+=("Four")
# ცვლადის სიგრძე
var="David"
echo ${#var} # 5
# მასივის ერთი ელემენტის
echo ${#myarray[0]}
# მასივისის სიგრძე
echo ${#myarray[@]}
for item in "${my_array[@]}"; do
echo $item
done
my_array[0]="One"
unset my_array[1]
echo This is my array content ${myarray[*]} length = ${#myarray[@]}
მნიშვნელოვანი შენიშვნა:
- ოპეარტორებს შორის უნდა იყოს დაცული მანძილი. მაგალითად
expr 2+2
არ იმუშავებას. სწორიაexpr 2 + 2
. - ბრძანება უნდა იყოს ჩაწერილი "ბექთიქებში"
ოპერატორი | აღწერა | მაგალითი |
---|---|---|
+ (მიმატება) | კრებს ოპერატორებს | expr $a + $b |
- (გამოკლება) | აკლებს ოპერატორებს | expr $a - $b |
* (გამრავლება) | ამრავლებს ოპერატორებს | expr $a \* $b |
/ (გაყოფა) | კრებს ოპერატორებს | expr $a / $b |
% (მოდულური გაყოფა) | კრებს ოპერატორებს | expr $a % $b |
= (მინიჭება) | ანიჭებს ცვლადს მნიშვნელობას | a = $b |
== (ტოლობა) | ადარებს ორ რიცხვის იგივეობას | [ $a == $b ] |
!= (უტოლობა) | ადარებს ორ რიცხვის განსხვავებულობას | [ $a != $b ] |
ოპერატორი | აღწერა | მაგალითი |
---|---|---|
-eq | თუ ოპერატორები უდრის, ბრუნდება true მნიშვნელობა |
[ $a -eq $b ] |
-ne | თუ ოპერატორები არ უდრის, ბრუნდება true მნიშვნელობა |
[ $a -ne $b ] |
-gt | თუ მარცხენა ოპერატორი > მარჯვენაზე, ბრუნდება true მნიშვნელობა |
[ $a -gt $b ] |
-lt | თუ მარცხენა ოპერატორი < მარჯვენაზე, ბრუნდება true მნიშვნელობა |
[ $a -lt $b ] |
-ge | თუ მარცხენა ოპერატორი >= მარჯვენაზე, ბრუნდება true მნიშვნელობა |
[ $a -ge $b ] |
-le | თუ მარცხენა ოპერატორი <= მარჯვენაზე, ბრუნდება true მნიშვნელობა |
[ $a -le $b ] |
მაგალითები
#!/bin/sh
a=10
b=20
if [ $a -eq $b ]
then
echo "$a -eq $b : a is equal to b"
else
echo "$a -eq $b: a is not equal to b"
fi
if [ $a -ne $b ]
then
echo "$a -ne $b: a is not equal to b"
else
echo "$a -ne $b : a is equal to b"
fi
if [ $a -gt $b ]
then
echo "$a -gt $b: a is greater than b"
else
echo "$a -gt $b: a is not greater than b"
fi
if [ $a -lt $b ]
then
echo "$a -lt $b: a is less than b"
else
echo "$a -lt $b: a is not less than b"
fi
if [ $a -ge $b ]
then
echo "$a -ge $b: a is greater or equal to b"
else
echo "$a -ge $b: a is not greater or equal to b"
fi
if [ $a -le $b ]
then
echo "$a -le $b: a is less or equal to b"
else
echo "$a -le $b: a is not less or equal to b"
fi
ოპერატორი | აღწერა | მაგალითი |
---|---|---|
! | false-ის უარყოფა გვაძლევს true-ს | [ ! false] |
-o | OR | [ $a -lt 20 -o $b -gt 100 ] |
-a | AND | [ $a -lt 20 -a $b -gt 100 ] |
მაგალითები
#!/bin/sh
a=10
b=20
if [ $a != $b ]
then
echo "$a != $b : a is not equal to b"
else
echo "$a != $b: a is equal to b"
fi
if [ $a -lt 100 -a $b -gt 15 ]
then
echo "$a -lt 100 -a $b -gt 15 : returns true"
else
echo "$a -lt 100 -a $b -gt 15 : returns false"
fi
if [ $a -lt 100 -o $b -gt 100 ]
then
echo "$a -lt 100 -o $b -gt 100 : returns true"
else
echo "$a -lt 100 -o $b -gt 100 : returns false"
fi
if [ $a -lt 5 -o $b -gt 100 ]
then
echo "$a -lt 100 -o $b -gt 100 : returns true"
else
echo "$a -lt 100 -o $b -gt 100 : returns false"
fi
ოპერატორი | აღწერა | მაგალითი |
---|---|---|
= | უდრის თუ არა ორი სტრიქონი ერთმანეთს | [ $a = $b ] |
!= | თუ სტრიქონები არ უდრის, აბრუნებს true-ს | [ $a != $b ] |
-z | თუ სტრიქონის სიგრძე უდრის ნულს, აბრუნებს true-ს | [ -z $a ] |
-n | თუ სტრიქონი არ არის ცარიელი, აბრუნებს true-ს | [ -n $a ] |
str | თუ სტრიქონი ცარიელია, აბრუნებს false-ს | [ $a ] |
unix shell-ში გამოიყენება if-ის შემდეგი ფორმები
- if...fi
- if...else...fi
- if...elif...else...fi
მაგალითი
#!/bin/sh
a=10
b=20
if [ $a == $b ]
then
echo "a is equal to b"
elif [ $a -gt $b ]
then
echo "a is greater than b"
elif [ $a -lt $b ]
then
echo "a is less than b"
else
echo "None of the condition met"
fi
ასევე შესაძლებელია case-ის გამოყენება
- case...esac
მაგალითი
#!/bin/sh
FRUIT="kiwi"
case "$FRUIT" in
"apple") echo "Apple pie is quite tasty."
;;
"banana") echo "I like banana nut bread."
;;
"kiwi") echo "New Zealand is famous for kiwi."
;;
esac
- while loop
- for loop
- until loop
- select loop
while command
do
Statement(s) to be executed if command is true
done
#!/bin/sh
a=0
while [ $a -lt 10 ]
do
echo $a
a=`expr $a + 1`
done
#!/bin/sh
for var in 0 1 2 3 4 5 6 7 8 9
do
echo $var
done
#!/bin/sh
for FILE in $HOME/.bash*
do
echo $FILE
done
#!/bin/sh
a=0
until [ ! $a -lt 10 ]
do
echo $a
a=`expr $a + 1`
done
ინტერაქტიიულ მენიუში შეიძლება იყოს მოთავსებული სხვადასხვა ფუნქცია...
მარტივი მაგალითი.
select item in tea cofee water juice appe all none
do
echo "You have selected ${item}"
done
შედარებით კომპლექსური მაგალითი.
#!/bin/bash
select DRINK in tea cofee water juice appe all none
do
case $DRINK in
tea|cofee|water|all)
echo "Go to canteen"
;;
juice|appe)
echo "Available at home"
;;
none)
break
;;
*) echo "ERROR: Invalid selection"
;;
esac
done
#!/bin/bash
echo "Select a Linux command to learn more about it:"
select cmd in ls pwd cd grep echo find mkdir rmdir touch exit
do
case $cmd in
ls)
echo "ls: List directory contents."
;;
pwd)
echo "pwd: Print name of current/working directory."
;;
cd)
echo "cd: Change the shell working directory."
;;
grep)
echo "grep: Search for patterns in files."
;;
echo)
echo "echo: Display a line of text."
;;
find)
echo "find: Search for files in a directory hierarchy."
;;
mkdir)
echo "mkdir: Make directories."
;;
rmdir)
echo "rmdir: Remove empty directories."
;;
touch)
echo "touch: Change file timestamps."
;;
exit)
echo "Exiting the menu."
break
;;
*)
echo "Invalid selection: $REPLY"
;;
esac
done
-e
-ს დამატება სტრიქონამდე საშუალებას გვაძლევს ჩავანაცვლოთ ისეთი "escape-იანი სიმბოლოები" როგორიცაა მაგალითად \n
#!/bin/sh
a=10
echo -e "Value of a is $a \n"
#!/bin/sh
DATE=`date`
echo "Date is $DATE"
USERS=`who | wc -l`
echo "Logged in user are $USERS"
UP=`date ; uptime`
echo "Uptime is $UP"
# | ფორმა | აღწერა |
---|---|---|
1 | ${var} |
ჩვეულებრივი ჩანაცვლება |
2 | ${var:-word} |
თუ ცვლად var-ს არ აქვს მნიშვნელობა, ის იქნება ჩანაცვლებული word-ის მნიშვნელობით |
3 | ${var:=word} |
default მნიშვნელობის მინიჭება. (if not set echo word) |
4 | ${var:+word} |
თუ ცვლად var-ს აქვს მნიშვნელობა, ის იქნება ჩანაცვლებული word-ის მნიშვნელობით |
5 | ${var:?message} |
თუ ცვლად var-ს არ აქვს მნიშვნელობა, message იქნება დაპრინტული standard error ში |
მაგალითები:
მაგალითი 1 - ჩვეულებრივი ჩანაცვლება
greeting="Hello, world!"
echo $greeting # Outputs: Hello, world!
მაგალითი 2 - თუ ცვლად არ აქვს მნიშვნელობა
echo "Welcome, ${username:-Guest}"
მაგალითი 3 - თუ ცვლად არ აქვს მნიშვნელობა
echo ${path:=/usr/bin}
echo $path # Outputs: /usr/bin
მაგალითი 4 - ალტერნატიული მნიშვნელობა
isLoggedIn=true
echo "Status: ${isLoggedIn:+Logged In}"
მაგალითი 5 - შეცდომის შეტყობინების ჩანაცვლება
echo "Configuration file: ${configFile:?"is not set"}"
result=$((3 + 2))
echo $result # Output: 5
echo {1..5} # Output: 1 2 3 4 5
text="hello world"
# ${ცვლადი:პოზიცია:სიგრძე}
echo ${text:6:5} # Output: world
text="hello world"
# ${ცვლადი:ძიება:ჩანაცვლება}
echo ${text/o/O} # Output: hellO world
text="hello world"
# ${ცვლადი:პოზიცია:სიგრძე}
echo ${text//o/O} # Output: hellO wOrld
#!/bin/bash
# ფუნქციის შექმნა
Hello () {
echo "Hello World"
}
# ფუნქციის გამოძახება
Hello
#!/bin/sh
# პარამეტრებიანი ფუნქციის შექმნა
Hello () {
echo "Hello $1 and $2"
}
# ფუნქციის გამოძახება
Hello David Mevid
#!/bin/sh
# პარამეტრებიანი ფუნქციის შექმნა
Hello () {
echo "Hello $1 and $2"
return 10
}
# ფუნქციის გამოძახება
Hello David Mevid
# ბოლო ბრძანების მნიშვნელობის მიღება
ret=$?
echo "დაბრუნებული მნიშვნელობა = $ret"
# ფუნქციის წაშლა
unset -f Hello
იმისთვის რომ ფუნქცია იყოს ხელმისაწვდომი სხვა ფანჯრებშიც
export -f Hello
greet_user() {
local name=${1:-"Guest"}
echo "Welcome, $name!"
}
greet_user # Output: Welcome, Guest!
ფორმატი deb http://http.kali.org/kali kali-rolling main non-free conrib {ფორმატი} {ლინკი} {გამოშვების ვერსია} {გაიდლაინების გათვალისწინება}
main - დაცულია ყველა წესი contrib - თავად პაკეტში დაცულია ყველა წესი, თუმცა დამოკიდებულია პაკეტებზე, რომლებიც არ იცავენ ყველა წესს non-free - არ არის დაცული წესები
ლინუქსის კონკრეტული გამოშვების ვერსიის სახელის სანახავად LSB (Linux Standard Base)
lsb_release -a
cd /etc/apt
ls -l
sudo add-apt-repository ppa:libreoffice/ppa
sudo add-apt-repository 'deb http://archive.getdeb.net/ubuntu wily-getdeb games'
sudo add-apt-repository --remove ppa:jonathonf/ffmpeg-4
(კონფიგურაციებით, სეთინგებით, დამოკიდებულებებით)
ppa-purge ppa:jonathonf/ffmpeg-4
apt update
- get არის განსხვავება timestamps-ებს შორის, შესაბამისად განახლება გადმოწერადია
- hit არ არის განსხვავება timestamps-ებს შორის, შეამოწმა, მაგრამ განახლება არ არის
- ign არ არის განსხვავება pdiff index file-ებში, სავარაუდოდ მიტოვებული რეპო