Даалгавар хийж дуусах эцсийн хугацаа: VII долоо хоног
Башийн боломжууд
- bash скриптийн аргументууд $1, $2, $3, ... -р төлөөлөгддөг. Жишээ нь, myscript.sh a b c d:
# ehnii argumentiin utga ni a 
FIRST_ARGUMENT=$1
  
# gurav dahi argumentiin utga ni c
ARG3=$3
  
# 0-r utga ni script uuruu baina
MYSELF=$0
  
# tav dahi argumentiin utga ni hooson
NOTHING=$5
FIRST_ARGUMENT=$1
# gurav dahi argumentiin utga ni c
ARG3=$3
# 0-r utga ni script uuruu baina
MYSELF=$0
# tav dahi argumentiin utga ni hooson
NOTHING=$5
- Эдгээрийн утганд хандахдаа $ тэмдэгтийг дараах маягаар хэрэглэдэг:
echo "This is my first argument $FIRST_ARGUMENT" 
echo "My name is $MYSELF, or ${MYSELF}"
echo "My name is $MYSELF, or ${MYSELF}"
- Мөн Bash хувьсагчийн утганд ямар нэг үйлдлийн үр дүнг оноох боломжтой байдаг. Жишээ нь:
# whoami commandiin ur dun ME -d olgogdono  
ME=`whoami`
# tuhain mashinii ner $MACHINE_NAME -d hadgalagdana
MACHINE_NAME=`hostname`
ME=`whoami`
# tuhain mashinii ner $MACHINE_NAME -d hadgalagdana
MACHINE_NAME=`hostname`
- bash -д нэг скрипт өөр скриптийг "source " командыг ашиглан ажиллуулж болдог. Энэ командын өөр нэг хэлбэр нь энгийн цэг тавиад (.) араас нь дуудах скриптийнхээ нэрийг өгдөг. Хэрэв зөвхөн функцүүд агуулсан скрипт байвал энэ аргыг ашиглаж тэдгээр функцийг өөр скриптээс дуудаж болдог. Java -гийнхаар бол import. Хэрэв тэр функцүүд бүхий скрипт нь функцээс гадна өөр үйлдлүүдтэй бол . (source) хийх үед тэдгээр үйлдлүүд нь ажиллах болно.
# script1.sh-g ajilluulah  
. script1.sh
  
# script2.sh-g ajilluulah
SCR2=script2
. ${SCR2}.sh
. script1.sh
# script2.sh-g ajilluulah
SCR2=script2
. ${SCR2}.sh
- bash-д ямар нэгэн жагсаалтаар гүйх нь маш амархан. Дараах маягаар гүйж болно."a b c d e f g" -ийн оронд ихэвчлэн `seq 1 100` (бүхэл тоо) болон `echo {a..z}` (тэмдэгт) -г ашигладаг.
MYLIST="a b c d e f g" 
for item in $MYLIST ; do
echo $item
done
for item in $MYLIST ; do
echo $item
done
- Баш-д илэрхийлэл бодож утга олгохдоо expr (бүхэл тооны хувьд) болон bc (бодит тооны хувьд) програмыг ашиглахаас гадна (( ))-г ашигладаг: Жишээ нь:
#!/bin/bash  
i=0
n=100
sum=0
while [ $i -lt $n ]; do
((i++))
((sum = sum + i ))
done
echo sum=$sum, i=$i
i=0
n=100
sum=0
while [ $i -lt $n ]; do
((i++))
((sum = sum + i ))
done
echo sum=$sum, i=$i
- Хэдийгээр Bash -ийн нөхцөл шалгалт нь зарим хүмүүст сонин харагдаж магадгүй ч энэ нь маш хүчирхэг. Түүний энгийн нэг жишээ:
if [ "foo" = "foo" ]; then 
echo it is true
else
echo it is not false
fi
echo it is true
else
echo it is not false
fi
- Ялгаатай тохиолдлуудад ялгаатай синтакс ашиглана. Жишээ нь файл байгаа эсэхийг шалгахдаа:
if [ -e $MY_FILE ] ; then 
echo Yep I have $MY_FILE
else
echo No such file
echo Yep I have $MY_FILE
else
echo No such file
- Дараах жагсаалт нь if-else-fi үйлдэлд ашиглаж болох шалгалтуудын зарим нь:
 Файл шалгах операторууд - хэрэв бол үнэн утга буцаана...
 −e - file exists - файл байна
 −f - file is a regular file - файл нь жирийн файл
 −s - file is not zero size - файлын хэмжээ нь 0 биш
 −d - file is a directory - файл нь директор
 −b - file is a block device (floppy, cdrom, etc.) - файл нь блок төхөөрөмж
 −c - file is a character device (keyboard, modem, sound card, etc.) - файл нь тэмдэгт төхөөрөмж
 −p - file is a pipe - файл нь pipe
 −L - file is a symbolic link - файл нь холбоос
 −S - file is a socket - файл нь сокет
 −r - file is readable (has read permission) - файлыг унших боломжтой
 −w - file has write permission - файлд бичих боломжтой
 −x - file has execute permission - файлыг ажиллуулах боломжтой
 −g - group−id flag set on file - файлд бүлгийн дугаарын төлөв тавигдсан
 −u - user−id flag set on file - файлд хэрэглэгчийн дугаарын төвөл тавигдсан
 −O - you are owner of file - чи файлын эзэмшигч
 −G - group−id of file same as yours - файлын бүлгийн дугаар чинийхтэй ижилхэн
 −t n - file descriptor n is open. This usually refers to stdin, stdout, and stderr (file descriptors 0 − 2) - файлын дүрслэгч n нээлттэй байна.
 f1 −nt f2 - file f1 is newer than f2 - шинэ
 f1 −ot f2 - file f1 is older than f2 - хуучин
 f1 −ef f2 - files f1 and f2 are links to the same file - 2 холбоос нэг ижил файлыг зааж байна
 
 Бүхэл тооны операторууд - хэрэв бол үнэн утга буцаана...
 −eq - is equal to ($a −eq $b) - тэнцүү
 −ne - is not equal to ($a −ne $b) - ялгаатай
 −gt - is greater than ($a −gt $b) - их
 −ge - is greater than or equal to ($a −ge $b) - их буюу тэнцүү
 −lt - is less than ($a −lt $b) - бага
 −le - is less than or equal to ($a −le $b) - бага буюу тэнцүү
 
 Тэмдэгт мөрийн операторууд - хэрэв бол үнэн утга буцаана...
 = - is equal to ($a = $b) - тэнцүү
 != - is not equal to ($a != $b) - ялгаатай
 \< - is less than, in ASCII alphabetical order ($a \< $b) - бага
 \> - is greater than, in ASCII alphabetical order ($a \> $b) - их
 −z - string is "null", that is, has zero length - хоосон
 −n - string is not "null" - хоосон биш
 
 Логик харьцуулалт
 = - logical equals - логик тэнцүү
 ! - "not" −− reverses the sense of the tests above (returns true if condition absent) - логик үгүйсгэл
 
 Нийлмэл харьцуулалт
 −a - logical and. exp1 −a exp2 returns true if both exp1 and exp2 are true. - логик ба
 −o - logical or -логик буюу
- Баш-д рекурс функцийг дэмждэг боловч утга буцаах тал дээр жаахан асуудалтай байдаг. Учир нь Башийн функц 0-255-ийн хооронд зөвхөн бүхэл тоон утга буцаадаг. Тиймээс утга буцаахдаа жирийн хувьсагч ашиглах нь ямар ч утга буцаах боломжийг олгоно. Дараах жишээнд 0-с өгөгдсөн бүхэл эерэг тоо хүртэлх тоонуудын нийлбэрийг олох рекурс функцийг дүрслэв.
#!/bin/bash  
function sums() {
if [ $1 -eq 0 ]; then
res=0
return
fi
(( tmp = $1 - 1))
sums $tmp
(( res = $res + $1 ))
}
  
sums 100
echo sums=$res
function sums() {
if [ $1 -eq 0 ]; then
res=0
return
fi
(( tmp = $1 - 1))
sums $tmp
(( res = $res + $1 ))
}
sums 100
echo sums=$res
Даалгавар
- Башийн дээрх бүх боломжийг туршиж үз.
- Өгөгдсөн тооны факториалыг олдог factorial нэртэй функц ба фибоначийн тоон дарааллын өгөгдсөн дугаар дахь гишүүнийг олдог fibonacci нэртэй функцүүдийг агуулсан скрипт бич. Скриптээ ~/sw302/lab03/flib.sh гэж хадгалаарай. Функцүүд res нэртэй хувьсагчаар утгаа буцаадаг байна.
- Эдгээр функцүүдийг ашиглан эхний мөрөнд зөвхөн 6-н факториал ба 2-р мөрөнд зөвхөн фибоначийн дарааллын 10-р гишүүнийг хэвлэдэг скрипт бич. Скриптээ ~/sw302/lab03/usage.sh гэж хадгалаарай. Энэ скриптэд функцүүд байх ёсгүй ба нөгөө flib.sh скриптнээсээ source буюу import хийх ёстой.
 
 
No comments:
Post a Comment