2014-05-21

ලිනක්ස් Shell Programming පාඩම-කොටස 16

while loop

දැන් අපි කතා කරන්නෙ while loop ගැන බලන්න while loopඑකේ syntax එක


   while
              [ condition ]
               do
                 මෙතන ලියන සියලු කමාන්ඩ් රන් වීම සිදුවේ.
            done
while loop එකේ තියන විශේෂත්වය තමයි ලබාදීල තියෙන condition එක false වෙනකන් දීල තියෙන කමාන්ඩ් ටික රන් කරවීම. බලන්න පහල තියෙන උදාහරණය කන්ඩිශන් එක true නිසා ඉවරයක් නැතුවම එකම කමාන්ඩ් එක රන් වීම සිද්ධ වෙනව.


##########################################
#!/bin/sh
#
#Script to test while statement
#
#
while [ 5 -eq 5 ]
do
echo "Welcome to while loop "
done
##########################################


හදිස්සියෙ වත් කොයි වෙලාවක හරි program එක ඇතුලෙදිම condition එක false උනොත් loop එක රන් වෙන එක නවතිනව.

The case Statement

මේක ගැන හොදටම තේරුම් ගන්න මුලින්ම පහල තියෙන උදාහරණෙ බලන්න.
##########################################
#!/bin/sh
#
# if no vehicle name is given
#
# if no command line arg



if [ -z $1 ]
then
rental="*** Unknown vehicle ***"
elif [ -n $1 ]
then
# otherwise make first arg as rental
rental=$1
fi



case $rental in
"car") echo "For $rental Rs.20 per k/m";;
"van") echo "For $rental Rs.10 per k/m";;
"jeep") echo "For $rental Rs.5 per k/m";;
"bicycle") echo "For $rental 20 paisa per k/m";;
*) echo "Sorry, I can not gat a $rental for you";;
esac


##########################################
මේක රන් කරන්න ඕන car , van ,jeep ,bicycle යන ඒවයින් මොකක් හරි පැරාමීටරයක් එක වරකට යොදා ගෙන(වෙන එකක් උනත් දීල බලන්න පුලුවන්)
මුලින්ම බලන්න මේ කොටස දිහා
-Z හා -n ගැන මම කලින් කියල තියෙනව
-Z කියන්නෙ string1 is NULL and does exist
-n කියන්නෙ string1 is NOT NULL and does exist


##############################################################
if [ -z $1 ] # $1 වේරියබල් එක හිස් නම් හා එහෙම එකක් පවතිනව
then # නම්
rental="*** Unknown vehicle ***" # rental කියන variable එකට ** Unknown vehicle *** assign කරන්න
elif [ -n $1 ] # $1 වේරියබල් එක නැත්නම් හා එහෙම එකක් පවතිනව
then # නම්
# otherwise make first arg as rental
rental=$1 # rental කියන variable එකට $1 assign කරන්න.
fi
###########################################################


ඊළගට බලන්න මේ කොටස


case $rental in
"car") echo "For $rental Rs.20 per k/m";;
"van") echo "For $rental Rs.10 per k/m";;
"jeep") echo "For $rental Rs.5 per k/m";;
"bicycle") echo "For $rental 20 paisa per k/m";;
*) echo "Sorry, I can not gat a $rental for you";;
esac # අවසානය.

$rental ගේ අගය car , van ,jeep ,bicycle යන අගයන් උනොත් අදාල පණිවිඩය echo මගින් print වීම සිදු වෙනව.ඒහෙම නොවුනොත් *) මගින් තියෙන ලයින් එක print වෙනව. මෙන්න මේකට තමයි මේ case statement කියල හදුන්වන්නෙ.
මේ තියෙන්නෙ මේකෙ syntax එක.


case
 $variable-name  in
               
pattern1)   command
                    
           ...
                    
           ..
                    
           command;;
               
pattern2)   command
                    
           ...
                    
           ..
                    
           command;;
               
patternN)   command
                    
           ...
                    
           ..
                    
           command;;
                *)
            command
                    
           ...
                    
           ..
                    
           command;;
           esac
මේක සමාන කරන්න පුලුවන් හරියට switch එකකින් light එකක් දානව වගේ වැඩකට. එක් ස්විව්
එකකින් ඒකට අදාල බල්බ් එක පත්තු කරන්න පුලුවන්.

de-bug the shell script

අපි ශෙල් program කරනකොට සමහර වෙලාවට ඒවයි තියෙන වැරදි (errors ) හොයාගන්න සිද්ධ වෙනව.හොයල ඒව නිවැරදි කරන්න සිද්ධ වෙනව මෙන්න මේකට අපි කියනව debug කරනව කියල.අපට මේක කරන්න පුලුවන් -x හා -v කියන option දෙක භාවිතා කරල.
මේක භාවිතා කරන්නෙ terminal එකේ ශෙල් ස්ක්‍රිප්ට් එක රන් කරනකොට.
Syntax එක මෙන්න මෙහෙමයි.
sh option { shell එකේ name එක. }
අපි මේක කරල බලමු. අපි මුලින්ම errors තියන ශෙල් ස්ක්‍රිප්ට් එකක් රන් කරල බලමු මොකද වෙන්නෙ කියල.ඔයාලති මේ ශෙල් එක ලියල රන් කරල බලන්න.
මේකෙ වරද තියෙන්නෙ tot= `expr $1 + $2` කියන තැන කියල ඔයාලට පේනව නේද?
##########################################
#!/bin/sh
#
#
# Script to show debug of shell
#
tot= `expr $1 + $2`
echo $tot

######################################
මේක රන් කරාම terminal එකේ expr: syntax error කියල පෙන්නුව නේද? අපි දැන් මේකට debug options හාවිතා කරල බලමු.
මුලින්ම බලමු -x කියන option එකත් එක්ක රන් කරල. දැන් ස්ක්‍රිප්ට් එක රන් කරන්න ඕන
sh -x script Name කියල දැන් ඔයාලට පෙනේවි ටර්මිනල් එකේ මෙන්න මේ විදියට

+ expr +
expr: syntax error
+ tot=
    echo
expr: syntax error කියල පෙන්නන්නෙ error එක තියෙන තැන.

ඊළගට බලමු අනිත් option එක යොදාගෙන රන් කරල.
##########################################
#!/bin/sh
#
#
# Script to show debug of shell
#
tot= `expr $1 + $2`
expr: syntax error
echo $tot

##########################################

මෙන්න මෙහෙම එකක් තමයි ටර්මිනල් එකේ පෙන්නන්නෙ කලින් පෙන්නපු විදියට වඩා මේ විදිය බලාගන්න පහසුයි නේද? ගොඩක් complex ස්ක්‍රිප්ට් debug කරනකොට මේකෙන් කරන එක තමයි පහසු.

ඔන්න මෙතනින් structured shell script පාඩම ඉවරයි ඊළගට පටන්ගන්නෙ advanced shell scripting


2014-05-15

ලිනක්ස් Shell Programming පාඩම-කොටස 15


3. if...else...fi


මම දැන් කියන්නෙ if else ගැන

  if condition
           then
                     condition එල true නම් else වලින් ඉහල
තියෙන සියලුම දේ රන් වෙනව.
                   
           else
    condition එල false නම් fi වලින් ඉහල
තියෙන සියලුම දේ රන් වෙනව.
                     
           fi

 මෙන්න මේ කතාවට තමයි if else කතාව කියල කියන්නෙ.අපි දැන බලමු ඒ සම්බන්ධ උදාහරණයක්

##########################################
#!/bin/sh
#
#

if test $1 -gt 0 
then 
echo "$1 number is positive" 
else 
echo "$1 number is negative" 
fi 

##########################################

මේ program එක ස්ක්‍රිප්ට් එකක ලියල run කරන්න ඕන integer පැරාමීටර් එකකුත්  එක්ක ප්‍රොගැම් එක ලියල තියෙන්නෙ ඒ ලබාදෙන පැරාමීටර් එක Program එක ඇතුලෙදි 0 වඩා ලොකුද? කියල බලල ලොකු නම් number is positive කියලත් නැත්තම්  number is negative කියලත් ප්‍රින්ට් වෙන්න.නිකන් බලන්න ඔය program එක පැරාමීටර් එකක් නැතුව රන් කරන්න බලන්න. එතකොට මොකද උනේ ?   number is negative කියල නේද ප්‍රින්ට් උනේ ? එහෙම තියන එක වැරදි නිසා අපි තවටිකක් program එක දියුණු කරමු මෙන්න මේ විදියට.

 ##########################################
#!/bin/sh 


if [ $# -eq 0 ] 
then 
echo "$0 : You must give/supply one integers" 
exit 1 
fi 

if test $1 -gt 0 
then 
echo "$1 number is positive" 
else 
echo "$1 number is negative" 
fi 

##########################################

  මේ programm එකේදි මුලින්ම check කරල බලනව command line එකේදි ලබාදීපු පැරාමීටර් එක මොකද්ද කියල ඒක 0 නම්  You must give/supply one integers කියල ප්‍රින්ට් කරල program එකෙන් exit කරනව.


Nested if-else-fi

මෙතනදි කතා කරන්නෙ if else එකක් ඇතුලෙ තියෙන තවත් if else එකක් ගැන බලන්න පහල තියෙන උදාහරණෙ.

##########################################
#!/bin/sh 


if [ $# -eq 0 ] 
then 
echo "$0 : You must give/supply one integers" 
exit 1 
fi 

if test $1 -gt 0 
then 
if test $1 -eq 5 
then 
echo “ Yes its five ” 
else 
echo “ Yes its not five ” 
fi 
else 
echo "$1 number is negative" 
fi 

##########################################

 මෙතන පළවෙනි If එක ඇතුලෙදි ආයෙමත් වාරයක් චෙක් කරනව ලබාදීපු අගය 5 ට සමානද නැද්ද කියල. මෙන්න මේ වගේ if else එකක් ඇතුලෙ තව තව if else ලියන එකට අපි කියනව Nested if-else-fi කියල. මෙන්න මේ වගේ තමයි syntax එක

if condition
        then
                if condition
                then
                        .....
                        ..
                        do this
                else
                        ....
                        ..
                        do this
                fi
        else
                ...
                .....
                do this
        fi

Multilevel if-then-else

දැන් අපි කතා කරන්න හදන්නෙ Multilevel if else ගැන.ම්ම්ම්ම්ම්...... අපි මුලින්ම කලින් කරපු if else ගැන ආයෙ පොඩ්ඩක් මතක් කරගන්න පොඩි වැඩක් කරල බලමු.

අපට මෙන්න මෙහෙම ප්‍රොග්‍රැම් එකක් හදාගන්න ඕන මොකද්ද දන්නවද? ළමයෙකුගෙ ලකුණු ඇතුලත් කරහම ඒ ළමයගෙ result එක ප්‍රින්ට් වෙන්න ඕන A , B ,C ,S ද F ද කියල.

75 -100 අතර  නම් A
65 -75 අතර  නම් B
45 -65 අතර  නම් C
45 ට අඩු නම් F
මුලින්ම ඔයාල try කරල බලන්න මේක කරල බලන්න.
##########################################

#!/bin/sh 


if [ $# -eq 0 ] 
then 
echo "Please Enter Marks First" 
exit 1 
fi 

if test $1 -ge 75 
then 
echo "A" 
fi 
if test $1 -ge 65 
then 
echo "B" 
fi 
if test $1 -ge 45 
then 
echo "C" 
else 
echo "F" 
fi 


##########################################

මෙක තමයි ඒ program එක ලියන වැරදි විදිය බලන්න වරදින තැන. ලකුණු 85 විතර ලබා දුන්නොත් A , B , C කියන තුනම ලැබෙනව එල නෙ !  අපේ විභාග දෙපාර්තමේන්තුව වගේ එහෙම වෙන්න බෑ අපට මෙන්න මේ program එක ලියන්න multilevel ඉෆ් එල්ස් යොදාගන්න පුලුවන් මෙන්න මේ වගේ

##########################################
#!/bin/sh 


if [ $# -eq 0 ] 
then 
echo "Please Enter Marks First" 
exit 1 
fi 

if [ $1 -ge 75 ] 
then 
  echo "A" 
elif [ $1 -ge 65 ] 
then 
  echo "B" 
elif [ $1 -ge 45 ] 
then 
  echo "C" 

else 
  echo "F" 
fi 

##########################################

if else කියන එක කෙටි කරල ලියල තියෙන්නෙ elif  කියල.[] වරහන් යොදන ආකාරයත් හොදට බලන්න ඒක ගොඩක් වැදගත්


Loops in Shell Scripts

                                        ලූප් මගින් අපට පුලුවන් මොකක් හරි එකම කමාන්ඩ් එකක් නැවත නැවත රන් කරන්න.සරලව කිව්වොත් එකම දේ ආයෙ ආයෙ කරන්න. Bash ශෙල් වලදි අපි loop වර්ග දෙකක් ගැන කතා කරනව. ඒව තමයි

1. for loop
2. while loop 

For Loop 

හිතන්න මෙහෙම අපට ඕන ටර්මිනල් එකේ welcome කියල 15 වාරයක් ප්‍රින්ට් කරන්න. මෙන්න මේ විදියට ඒක කරන්න පුලුවන්.

##########################################
#!/bin/sh 


echo "Welcome " 
echo "Welcome " 
echo "Welcome " 
echo "Welcome " 
echo "Welcome " 
echo "Welcome " 
echo "Welcome " 
echo "Welcome " 
echo "Welcome " 
echo "Welcome " 
echo "Welcome " 
echo "Welcome " 
echo "Welcome " 
echo "Welcome " 
echo "Welcome " 



##########################################

වැඩේ කැතයි නේද? 100 විතර ප්‍රින්ට් කරගන්න උනොත් මොනව වේද? දැන් අපි ඒක for loop එකක් මගින් කරල බලමු.

##########################################
#!/bin/sh 


for my in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
do 
echo "Welcome " 
done 
##########################################

 ඔන්න ඔච්චරයි ලියන්න තියෙන්නෙ. මෙතන my කියල තියෙන්නෙ වේරියබල් නේම් එකක් ඒකට කැමති නමක් දෙන්න පුලුවන්. In 1 2 3 ..  කියල තියෙන්නෙ repeat වෙන්න ඕන වාර ගණන.do හා  done කියන එක අතර ලියන්න ඕන අපට repeat කරගන්න ඕන කමාන්ඩ් ටික.

දැන් මෙන්න මේ program එක බලන්න අපට මේකෙන් ගන්න පුලුවන් ඕනම එකක ගුණිතය   සරලව කිව්වොත් චක්කරේ.
###########################################################
#!/bin/sh 


if [ $# -eq 0 ] 
then 
echo "Please Enter Number First" 
exit 1 
fi 
n=$1 
for i in 1 2 3 4 5 6 7 8 9 10 11 12 
do 
echo "$n * $i = `expr $i \* $n`" 
done
###########################################################
for loop එකේ syntax එක මෙන්න මෙහෙමයි
         
 for { variable name } in { list }
            do
                     මෙහි ලියන සියලු කමාන්ඩ් execute වේ.
            done
බලන්න පහල තියෙන syntax එක දිහා

for (( expr1; expr2; expr3 ))
         do
              මෙහි ලියන සියලු කමාන්ඩ් execute වේ.
         Done

  මේ තියන විදිය තමයි ගොඩක් දුරට for loop ලියන්න use කරන්නෙ.

##########################################
#!/bin/sh 


for (( i = 0 ;  i <= 5;  i++  )) 
do 
  echo "Welcome $i times" 
done 

##########################################

(( ))  ඇතුලෙ කොටස් තුනකින් සමන්විත වෙනව i=0 කියන්නෙ I කියන වේරියබල් එක initialization කරන අවස්ථාව I <=5  කියල කියන්නෙ repeat වෙන්න ඕන අවශය වාර ගණන. I++ කියන එකෙන් වෙන්නෙ I ගෙ අගය එකකින් වැඩි කරන එක( i=i+1 කියන එකම තමයි)
 දැන් බලන්න මේකත්

##########################################
#!/bin/sh 


for (( i = 0 ;  i <= 5;  i++  )) 
do 
  j=i+1 
   echo “ Hi $i” 

done 


##########################################
 

Nesting of for Loop
         මේකට් nesting if else වගේම තමයි loop එකක් ඇතුලෙ තව loop එකක් දාල රන් කරවන එක තමයි මෙතනදි සිද්ධ වෙන්නෙ.
##########################################
#!/bin/sh 


for (( i = 0 ;  i <= 5;  i++  )) 
do 
  for (( j= 0 ;  j <= 5;  j++  )) 
do 
echo “Welcome $i welcome $j” 
  
done 
done 


##########################################
 
මේක කරල බැලුවද ? Inner loop එක ඇතුලෙ තියෙන කමාන්ඩ් එක 25 වතාවක් රන් වෙනව කියල පේනව නේද ?
අපි දැන් මෙන්න මේ වගේ එකක් ප්‍රින්ට් කරගන්න try එකක් දීල බලමු.
*
**
***
****
*****

මෙන්න මේකට ලියන්න ඕන program එක මෙහෙමයි
##########################################
#!/bin/sh 


for (( i = 1 ;  i < 6;  i++  )) 
do 
  for (( j= 0 ;  j <i;  j++  )) 
do 
echo  -n "*" 
   
done 
echo "" 
done 


#############################################
පළවෙනි loop එක එක පාරක් රන් වෙද්දි අනිත් ඇතුලෙ තියෙන loop එක රන් වෙන වාර ගණන එකින් එක වැඩි වෙන එක සිද්ධ වීමෙනුයි * රටාවකට print වීම සිද්ධ වුණේ echo "" මගින් කරේ * ගණන ප්‍රින්ට් කරල නිව් ලයින් එකකට කර්සර් එක යවපු එක.

දැන් ඔයාල මේ පහල තියෙන චෙස් බොර්ඩ් එකක් විදියට output එක ලැබෙන program එක study කරල බලන්න.

##########################################
#!/bin/sh 


for (( i = 1; i <= 9; i++ )) ### Outer for loop ### 
do 
   for (( j = 1 ; j <= 9; j++ )) ### Inner for loop ### 
   do 
        tot=`expr $i + $j` 
        tmp=`expr $tot % 2` 
        if [ $tmp -eq 0 ]; then 
            echo -e -n "\033[47m " 
        else 
            echo -e -n "\033[40m " 
        fi 
  done 
 echo -e -n "\033[40m" #### set back background colour to black 
 echo "" #### print the new line ### 
done 

##########################################

2014-05-14

ලිනක්ස් Shell Programming පාඩම-කොටස 14


මේ පාඩමේ ඉදන් අපි කතා කරන්නෙ වයුහාත්මක shell ප්‍රොග්‍රැමින් ගැන.

  1. structured ශෙල් ගැන......
ඇත්තටමෙ මේකෙදි කතා කරන්න තියෙන්නෙ තර්ක හා තීරණ ආශිත දේවල්. තීරණ හා තර්ක අපට අලුත් දේවල් නෙවෙයි නෙ. අපි නිතරම තීරණ ගන්නව තර්ක කරනව ඉතින් ඒ ගැන ආයෙ අමුතුවෙක් කතා කරන්න ඕන නෑ කියලයි මම හිතන්නෙ. අපි ගන්න තීරණ හා තර්ක තරම් සංකීර්ණ නෑ කම්පියුටර් එකට තේරෙන තර්ක හා තීරණ. කම්පියුටර් වලට තේරෙන්නෙ 1 හා 0 කියන අවස්ථා දෙක විතරක් නිසයි එයාට අපි හිතන තරම් ලොකු දේවල් තේරෙන්නෙ නැත්තෙ.
දැන් ඉතින් මේ කතාව පැහැදිලි කරගන්න මේ වැඩේ කරන්න

ටර්මිනල් එක ඔපන් කරල bc කියල ටයිප් කරල එන්ටර් කරන්න. bc කියල කියන්නෙ ලිනක්ස් වල තියෙන කැල්කියුලේටර් වැඩසටහනක්.මේකට ලස්සන ඉන්ටෆේස් එකක් නම් නැහැ ටර්මිනල් එක මත තමයි ඩිස්පෙලේ වෙන්නෙ.


bc කියල එන්ටර් කරහම කර්සර් එක බිලින්ක් වෙවී තියෙනව. දැන් ඔයාල මේව එකින් එක ටයිප් කරල එන්ටර් කරල බලන්නෙකො.
  1. 14+6
  2. 12-1
  3. 7*8
  4. 14/2
උත්තර අවෙ මේව නේ
      1. 20
      2. 11
      3. 56
      4. 7
ඊළඟට මේක කරල බලන්න
      1. 14>3
      2. 5<2
      3. 5<=8
      4. 7<=4
      5. 3!=2
      6. 5=5
      7. 3!=3
! සලකුණෙන් අදහස් කරන්නෙ NOT කියන එක.(නෑ කියන එක) != මගින් අදහස් කරන්නෙ සමාන නෑ කියන එක (not equal)

පිළිතුරු වුනේ මේව නේද ?
          1. 1
          2. 0
          3. 1
          4. 0
          5. 1
          6. 1
          7. 0
මේව වල පිළිතුරු 1 හා 0 උනේ ඇයි කියල දන්නවද ? ඒ ඒ අවසථා වල අපි කරපු දේවල් ඇත්ත නම් ප්‍රතිඑලය 1 උනා එහෙම නැත්තම් 0 උනා. ආයෙ බලමු ඒ උදාහරණ ටික.
        1. 14>3 -: 3 වඩා 14 ලොකු නිසා මේක ඇත්ත. true
        2. 5<2 -: මේක පට්ට බොරුවක් නිසා false
        3. 5<=8 -: සමාන නොවුනත් විශාල නිසා මේක true
        4. 7<=4 -: මේකත් බොරු false
        5. 3!=2 -: තුන දෙකට සමාන නැති නිසා මේක true
        6. 5=5 -: පහ පහට සමාන නිසා මේක true
        7. 3!=3 -: මේක බොරු කියල පෙනව බැලුව ගමන් false
ලිනක්ස් ශෙල් වලදි මේ ඇත්ත බොරු(true , false) කතාව පෙඩ්ඩක් වෙනස් වෙනව.
ශෙල් වලදි true false කියන දෙක ඉදිරිපත් කරන්නෙ මෙහෙමයි
1ඒ කිව්වෙ true කියන එක 0 මගින් පෙන්නනව.
0 ඒ එහෙමත් නැත්තම් false කියන එක 0 නොවන අගයක් මගින් පෙන්නනව.තවදුරටත් පැහැදිලි කර ගන්න පහල තියෙන වගුව බලන්න.මේක නිසැකවම මතක තියාගන්න නැත්තම් ඔක්කොම පැටලෙනව.

කලින් bc වලින් පෙන්නපු අගය
අගය
ශෙල් වල පෙන්නන ආකාරය
1
true
0
0
false
බිංදුව නොවන ඕනෑම අගයක් (-9 ,8 ,32)

Test command or expression

command එකක් හරි expression එකක් හරි ටෙස්ට් කරල බලන්න පුලුවන් විදියක් තියෙනව දැන් අපි පොඩ්ඩක් ඒ ගැන බලමු.

මුලින්ම බලන්න පහල තියෙන උදාහරණෙ දිහා

##############################################################

$ gedit > ispostive
#!/bin/sh
#
# Script to see whether argument is positive
#
if test $1 -gt 0
then
echo "$1 number is positive"
fi

##############################################################

මෙක ලියල mod කරල රන් කරන්න ඔන කමාන්ඩ් ලයින් ආර්ගියුමන්ට් එකකුත් එක්ක. ඒ ලබාදෙන ආර්ගියුමන්ට් එක පොසිටිව් නම් number is positive කියල ප්‍රින්ට් වෙනව.ඒ වැඩේ සිද්ධ වෙන්නෙ මෙන්න මේ ලයින් ටිකෙන්.

if test $1 -gt 0
then
echo "$1 number is positive"

test $1 -gt 0 කියන එකේ තේරුම $1 වේරියබල් එකේ තියන අගය 0 වඩා විශාල නම් number is positive කියන එක ප්‍රින්ට් කරන්න කියල. (-gt කියල කිව්වෙ is greater than කිය්න එක. පහල දක්වල තියනව තව ඒවගේ ඒව ගැන)

test කියන කමාන්ඩ් එකෙන් නිතරම 0 හෝ වෙනයම් අගයක් return කරනව අදාල කමාන්ඩ් එකට හෝ expression එකට අදාල. අපට මේක use කරන්න පුලුවන්
1.Integer ( Number without decimal point)
2.File types
3.Character strings
කියන ඒවත් එක්ක.

පහල තියෙන table එක බැලුවහම මේ ගැන හොදටම තේරුම ගන්න පුලුවන්

For Mathematics, use following operator in Shell Script
Mathematical Operator in  Shell Script 
Meaning
Normal Arithmetical/ Mathematical Statements
But in Shell



For test statement with if command
For [ expr ] statement with if command
-eq is equal to 5 == 6 if test 5 -eq 6 if [ 5 -eq 6 ]
-ne is not equal to 5 != 6 if test 5 -ne 6 if [ 5 -ne 6 ]
-lt is less than 5 < 6 if test 5 -lt 6 if [ 5 -lt 6 ]
-le is less than or equal to 5 <= 6 if test 5 -le 6 if [ 5 -le 6 ]
-gt is greater than 5 > 6 if test 5 -gt 6 if [ 5 -gt 6 ]
-ge is greater than or equal to 5 >= 6 if test 5 -ge 6 if [ 5 -ge 6 ]

For string Comparisons use
Operator
Meaning
string1 = string2 string1 is equal to string2
string1 != string2 string1 is NOT equal to string2
string1 string1 is NOT NULL or not defined
-n string1 string1 is NOT NULL and does exist
-z string1 string1 is NULL and does exist
Shell also test for file and directory types
Test
Meaning
-s file   Non empty file
-f file   Is File exist or normal file and not a directory
-d dir    Is Directory exist and not a file
-w file  Is writeable file
-r file   Is read-only file
-x file   Is file is executable
Logical Operators


Logical operators are used to combine two or more condition at a time
Operator           
Meaning
! expression Logical NOT
expression1  -a  expression2 Logical AND
expression1  -o  expression2 Logical OR

  1. if කොන්දේසිය (if Condition )
අපිට මේ if කියන condition එක මගින් පුලුවන් අවස්ථා නිර්මාණය කරන්න.අවස්ථා කිව්වෙ තර්ක කරනව වගේ වැඩ.බලන්න පහල තියෙන අවස්තා.

1. “උබ මට ගැහුවෙත් මමත් ගහනව ”
2. “පහ විශාල නම් තුනට වඩා big කියල ප්‍රින්ට් කරන්න ”

මෙතනදි ගහන්නෙ ගැහුවොත් විතරයි. එහෙම නැතුව ගහන්න යන්නෙ නෑ. මේ වගේ දෙයක් තමයි if මගින් නිරූපනය කරන්න පුලුවන් තව ඉස්සරහ උදාහරණ වලදි මේක හොදට තේරුම් ගන්න පුලුවන් වෙයි. දෙවනියට දීල තියෙන උදාහරනෙ කරල බලමු දැන්.

#############################################################################
$ gedit > my
#!/bin/sh
#
#Script to print big
#
if 5 > 3
then
echo “Big”
fi

#################################################################




සුබ වෙසක් මංගල්‍යයක් වේවා......


2014-02-19

ලිනක්ස් Shell Programming පාඩම-කොටස 13



    26.Filter පෙරන වැඩ.
          සාමාන්‍යයෙන් පෙරන්නෙ මොකටද කියල දන්නවනෙ ? අවශ්‍ය දේවල් විතරක් ගන්න ඕන උනාමනෙ අපි පෙරීමක් සිදු කරන්නෙ මේකත් ඒ වගේ දෙයක් තමයි.මේ ගැන වෙනම පාඩමකින් කියලදෙන්නම්.

27.Processes එකක් කියන්නෙ මොකද්ද ?
ඇත්තටම Processes එකක් කියල කියන්නෙ යම් කිසි කියාවලියකට. අපිට ls කියන කමාන්ඩ් එක use කරල ඩිරෙක්ටරි එකක තියෙන දේවල් බලා ගන්න පුලුවන්. ls කමාන්ඩ් එක මගින් ඉල්ලා සිටිනව කම්පියුටර් එකෙන් files හා folders පෙන්නා දෙන්න කියල . සරලවම මේකත් process එකක් කියල කියන්න පුලුවන්. මේ නිසා Processes එකක් program එකක් විදියට හදුන්වන්න පුලුවන් (user දීපු කමාන්ඩ් එකක් ). අපි කමාන්ඩ් එකක් මගින් බලාපොරොත්තු වෙන්නෙ මොකක් හරි විශේෂිත වැඩක් කරගන්නනෙ කමාන්ඩ් එක රන් කරාම ඒකට අදාල process එක සිද්ධ වෙලා අපට ඕන උන දේ සිද්ධ වෙනව.ලිනක්ස් වලදි මොනව හරි process එකක් සිද්ධ වෙනකොට ඒ process එකට නම්බර් එකක් දෙන සිරිතක් තියෙනව. මේ නම්බර් එක process-id එක එහෙම නැත්තම් PID කියල කියල හදුන්වනව. 0 ඉඳල 65535 අතරෙ ඉලක්කමක් තමයි PID එක සඳහා ලබා දෙන්නෙ. එක කමාන්ඩ් එකකට ලබාදෙන pid අගය එක එක වෙලාවල් වලට වෙනස් වෙනව.ඉස්සරහට තවත් මේ ගැන කතා කරනව.
  1. Processes කියන ඒව අවශ්‍ය වෙන්නෙ ඇයි.
දන්නවනෙ ලිනක්ස් කියන්නෙ multi-user, multitasking Os එකක් කියල.ඒ කිව්වෙ එක පාරකට users ල ගොඩ දෙනෙකුට use කරන්නයි.වැඩ ගොඩක් එක පාරකට කරන්නයි පුලුවන් කියන එක. වැඩ ගොඩක් එක පාරට කරනව කිව්වෙ මෙන්න මෙහෙම දෙයක්
අපි හිතමු අපට ඔන අපේ කම්පුටර් එකේ තියන files ඔක්කෝගේම එකතුවක් ගන්න. මෙන්න මේ කමාන්ඩ් එකෙන් පුලුවන් ඒ වැඩේ කරන්න.

ls / -R | wc -l

ඉතින් ගිගාබයිට් දෙසීය තුන්සීය තියෙන අපේ hard disk වල files වල count එකක් ගන්න ගොඩක් වෙලාවක් බලන් ඉන්න ඔනනෙ.මේක ඉවරවෙන කම් කම්පියුටර් එක් දිහා බලන් ඉන්නෙ නැතුව තව කමාන්ඩ් එකක් රන් කරව ගන්න අපට පුලුවන් මේකට තමයි මේ multitasking කියල කියන්නෙ යම් කිසි වැඩ එකකට වැඩි ප්‍රමාණයක් එක වර සිදු කර ගන්න පුලුවන්. සින්දුවක් අහන ගමන් ලියුමක් ලියනව වගේ වැඩත් මේ වගේ.
කලින් ලියපු කමාන්ඩ් එක රන් වෙන අතර තුර වෙන කමාන්ඩ් එකක් වෙනමම රන් කරන්න පුලුවන් නැත්තම් කලින් කමාන්ඩ් එකේ අගට ම & සලකුණ යොදල තව කමාන්ඩ් එකක් ලබාදෙන්න පුලුවන් එක පාරට දෙකම රන් වෙන්න කියල
ls / -R | wc -l & කමාන්ඩ් 2

අපි කලින් කතා කරා නෙ රන් වෙන කමාන්ඩ් එකකට process එකක් කියල හදුන්වනව කියල ඒ වගේම PID ගැනත් කතා කරානෙ මතක තියා ගන්න මේ PID එකෙන් අපට පුලුවන් එකට අදාල process එක refer කරන්න. ඊළඟට බලමු ඒ ගැන.

  1. process හා PID ගැන තව දුරටත්


අපි දැන් කලින් කතා කරපු දේවල් තව දුරටත් පැහැදිලි කරගමු.දැන් පොඩි පොඩි වැඩ ටිකක් කරල බලමු. සමහර දේවල් කරන්න කම්පියුටර් එකේ ඇඩ්මින් ගෙ බලතල ලබා ගන්න ඕන ලින්ක්.........
ඒ නිසා su කමාන්ඩ් එක ටයිප් කරල අඩ්මින් ලොග් වෙන්න.
          1. top :- මේ කමාන්ඩ් එක රන් කරහම අපට දැනට කම්පියුටර් එකේ රන් වෙමින් පවතින ප්‍රොසෙස් ටික බලා ගන්න පුලුවන්.

වම් පැත්තෙ කොනේම තියෙන්නෙ PID එක අදාල ප්‍රොසෙස් එක තවත් memory,cpu වගේ ඒවගෙ usage එක්ත් පෙන්නනව.
ඔකෙන් ඉවත් වෙන්න q හරි ctrl +c හරි press කරන්න.
 *** shift+m යතුරු එබීමෙන් වැඩියෙන්ම මෙමරි use කරන වැඩසටහන උඩට ගන්න පුලුවන්. ***
          1. kill {PID} :- මම කලින් කිව්වනෙ pid එකෙන් ප්‍රොසෙස් එකක් refer කරන්න පුලුවන් කියල මේ තියෙන්නෙ එහෙම කරන විදියක්. අපි හිතමු 2546 කියන ප්‍රොසෙස් එක නවත්වන්න ඔන කියල එතකොටKill 2546 කියන් කමාන්ඩ් එක මගින් ඒදේ කරගන්න පුලුවන්.
**ඇඩ්මින්ට උනත් සියලුම ප්‍රොසෙස් නවත්වන්න බෑ 95-98% ප්‍රමාණයක් වගේ තමයි එයාට පුලුවන්.**

          1. PID එකෙන් වගේම ප්‍රොසෙස් එකේ නමෙනුත් අපට ඒක referකරන්න පුලුවන් එතකොට කරන්නෙ මෙහෙමයි.

killall   {Process-name}
4.ps -ag :- කියන එකෙන් පුලුවන් දැනට රන් වෙමින් තියෙන ප්‍රොසෙස් ටික බලා ගන්න.

          1. kill 0 :- මගින් පුලුවන් රන් වෙමින් තියෙන අපේ ශෙල් එක ඇර අනෙක් ඒව ඔක්කොම කිල් කරන්න.
          2. ps aux :- මේකෙන් පෙන්නනව ප්‍රොසෙස් වල අයිතිය හිමි අය (ඇඩ්මින් හෝ වෙන යම් user )
          3. pstree :- tree එකක් (ගහක අතුබෙදුන) විදියට ප්‍රොසෙස් එක දකින්න පුලුවන්.
          4. අපට පුලුවන් අපි දන්න කියන ප්‍රොසෙස් එකක් රන් වෙනවද කියල බලාගන්න.ඒක බලන්න මේ කමාන්ඩ් එක use කරන්න පුලවන්

ps ax | grep  process name

          1. ps :- මේකෙනුත් පුලුවන් දැනට රන් වෙන ප්‍රොසෙස් බලා ගන්න.



ඔන්න මෙතනින් ලිනක්ස් ශෙල් පාඩම ඉවරයි. ඉවරයි කිව්වට ඉවරම නෑ ඉවර උනේ මූලික සංකල්ප ටික. ඊළඟට තමයි structured shell programming පටන් ගන්නෙ.