ts icon
سرور تیم اسپیک گاردایران

پست های پیشنهاد شده

    بخش دوم - قسمت اول

در بخش اول درمورد مقدمات و موارد مرتبط با اسکریپتینگ صحبت کردیم , حتی ممکنه به نظر برسه بعضی جاها یکم هم در حال دور شدن از بحث اصلیمون بودیم , ولی جلوتر که بریم متوجه کنترل بیشترتون روی مباحث میشید , معتقد بودم با این روش میتونم روی پیشرفت سطح بخش های بعدی و کنترل شما در یادگیری تعادل برقرار کنم , امیدوارم با پیشروی در بخش دوم این موضوع قابل لمس بشه


    استفاده از چندین دستور :

    یکی از عناصر ماهیت اسکریپتینگ به طور ساده میشه قابلیت استفاده از چندین دستور , و یا استفاده از خروجی یک پروسه یا دستور به عنوان ورودی یه دستور دیگه , شل به شما این اجازه رو میده تا زنجیره وار دستورات رو در یک مرحله اجرا کنید
    برای اجرای همزمان دستورات با هم تنها کافیه اونها رو با هم در یک خط نوشته و با ( ; ) از هم جدا کنید , مثل :

$ date ; who
Mon Feb 21 15:36:09 EST 2019
rednaxela tty2         2019-02-21 15:26
red tty3        2019-02-21 15:26
blue tty1         2019-02-21 15:26


    شما اولین شل اسکریپتتون رو نوشتید , در خط اول خروجی اولین دستور و در سه خط بعد خروجی دومین دستور چاپ شده , طبق ترتیبی که دستورات نوشته شدن

    با این روش شما میتونید دستورات رو تا 255 کاراکتر در هر خط بنویسید
    که با نوشتن تو یک فایل و اجرای اون دیگه لازم نیست هر بار این عمل تکرار بشه


    ساخت فایل اسکریپت :

    وقتی شروع به ساخت فایل شل اسکریپت میکنید , در وحله اول نیاز دارید تعین کنید فایل با کدوم شل خونده بشه , که این کار رو در اولین خط شل اسکریپتمون انجام میدیم , با استفاده از کد زیر :

#!/bin/bash


    در یک خط نرمال شل اسکریپت از کاراکتر # برای مشخص کردن توضیحات استفاده میشه و کد های بعد از اون قدرت اجرایی ندارن , هرچند اولین خط از شل اسکریپتمون بحثش جداست

همین موضوع باعث میشه شما حتی اگه توی یک شل دیگه اسکریپت رو اجرا کنید با توجه با مقدار خط اول اسکریپت ما با شل بش اجرا بشه
    بعد از مشخص کردن نوع شل , دستورات خط به خط نوشته میشه و از # هم برای کامنت ها استفاده میکنیم

#!/bin/bash
# in script tarikh va user haye login karde ro neshoon mide
date
who


    که البته طبق دستورالعمل مثال اول میتونید دستورات رو پشت سر هم بنویسید
    حالا اسکریپت رو تو یه فایل به اسم test1 ذخیره میکنیم
    تقریبا کار تمومه , فقط برای اجرای شل اسکریپتتون باید به نکات زیر توجه داشته باشید

    اگه مثل دستور ها بخواید اجراش کنید نتیجه نمیگیرید , مثال زیر :

$ test1
bash: test1: command not found


    در این حالت شل فایل اسکریپتمون رو یه دستور قلمداد میکنه , و برای اجرای دستور میره سراغ پیدا کردنش , که محتوای متغیر PATH رو چک میکنه و چون در فایل ادرس چنین دستوری پیدا نمیشه ارور دستور پیدا نشد رو بهمون میده

$echo $PATH

/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/bin:/usr/bin:
/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/user/bin:


    برای پیدا کردن اسکریپت توسط شل دو راه وجود داره

    یا باید ادرس دایرکتوری ای که اسکریپت اونجاست رو به متغیر PATH اضافه کنیم 

    یا باید مستقیما مسیر اسکریپت رو به خود شل بگیم
    در مثال زیر ما از روش دوم استفاده میکنیم
    اگه یادتون بیاد گفته بودیم برای مشخص کردن مسیر فعلی میتونیم از یک دات به صورت تکی استفاده کنیم , مثال زیر :

$ ./test1
bash: ./test1: Permission denied


    میبینید که شل , اسکریپتمون رو پیدا کرد

    ولی مشگل دیگه ای پیش اومده که اون نداشتن اجازه اجراس

$ ls -l test1
-rw-rw-r--    1 rednaxela     rednaxela          73 Sep 24 19:56 test1
$ chmod u+x test1
$ ./test1

Mon Feb 21 15:38:19 EST 2019
rednaxela tty2         2019-02-21 15:26
red tty3        2019-02-21 15:26
blue  tty1        2019-02-21 15:26


    میبینید که دسترسی داده شد و اسکریپت توسط شل دیده و اجرا شد


    نمایش پیام ها :

$ echo in ye teste
in ye teste


    در صورت استفاده از کوتیشن در متن باید رشته رو بین کوتیشن دیگه ای گذاشت :

echo "in ye teste ke ' tafavot ro bebinim"
in ye teste ke ' tafavot ro bebinim
echo 'scripting dar "guardiran".'
scripting dar "guardiran".

 

استفاده از echo در اسکریپتمون :

 

$ cat test1
#!/bin/bash
# in script tarikh va user haye login karde ro neshoon mide
    echo zaman va tarikh :
    date
    echo user haye login karde :
    who


    بعد از اجرای اسکریپت بالا :

$ ./test1
zaman va tarikh :
Mon Feb 21 15:41:13 EST 2019
user haye login karde :
rednaxela tty2         2019-02-21 15:26
red tty3        2019-02-21 15:26
blue  tty1        2019-02-21 15:26


    استفاده از متغیر ها :

    متغیر ها بهمون اجازه میدن اطلاعات مختلف رو در شل اسکریپتمون نگهداری کنیم برای استفاده توسط بقیه دستورات

    شما قبلا با متغیر های محیطی اشنا شدید , میتونید از مقادیری که نگه میدارن در اسکریپت استفاده کنید

$ cat test2
#!/bin/bash
# namayeshe etelaAte user
    echo "etelaAte user baraye karbare : $USER"
    echo UID: $UID
    echo HOME: $HOME


    مقدار متغیر های محیطی  USER  &  $UID  &  $HOME$ برای نمایش اطلاعات استفاده شدن

$chmod u+x test2
$ ./test2
etelaAte user baraye karbare : rednaxela
UID: 501
HOME: /home/rednaxela


    برای غیر فعال کردن کاراکتر های عملگرا از بک اسلش استفاه میکنیم

echo "gheymate in mahsool mishe \$50"
gheymate in mahsool mishe $50


    در غیر این صورت شل مقدار بعد از $ رو اسم متغیری تصور میکرد که ما قصد نمایش مقدارش رو داریم

    توجه کنید شل برای اسم متغیر ها به حروف کوچیک و بزرگ حساسه

    و شل خودکار نوع مقدار هر متغیر رو تشخیص میده

    

$ cat test3
#!/bin/bash
# test moteghayer ha
    d=10
    u="rednaxela"
    echo "$d rooz pish $u online shod"
    d=5
    u="red"
#
    echo "$d rooz pish $u online shod"

    khorooji script =>

    $ chmod u+x test3
    $ ./test3
    10 rooz pish rednaxela online shod
    5 rooz pish red online shod


    شما میتونید حتی مقدار یک متغیر رو به عنوان مقدار به یک متغیر دیگه بدید

$ cat test4
#!/bin/bash
# ekhtesas dadane meghdare yek moteghayer be moteghayere dg
    var1=10
    var2=$var1
    echo natije mishe : $var2
    
    khorooji script =>
    
    $ chmod u+x test4
    $ ./test4
    natije mishe : 10


    توجه کنید ما با علامت $ مقدار رو مشخص کردیم , وگرنه اسم متغیر به عنوان رشته مقدار دهی میشد , مثال زیر :

var1=10
var2=var1
    echo natije mishe : $var2

    khorooji script =>

    $ ./test4
    natije mishe : var1


    اختصاص خروجیه دستور به متغیر :

    این قابلیت یکی از کارامد ترین موارد شل اسکریپت هستش , فرمت و مثال :    

moteghayer=$(dastoor)
    
$ cat test5
#!/bin/bash
    testing=$(date)
    echo "zaman va tarikh : " $testing

    khorooji script =>

    $ chmod u+x test5
    $ ./test5
    zaman va tarikh :  Mon Jan 31 20:23:25 EDT 2019


    یه مثال کاربردی تر :

#!/bin/bash
emrooz=$(date +%y%m%d)
ls /usr/bin -al > log.$emrooz


    در اسکریپت بالا دستور دیت با فرمت عددی (دریافت خروجی به صورت روز ماه سال جمعا شش رقم) اجرا شده و خروجی دستور به متغیر امروز داده شده , سپس مقادیر دایرکتوری با اطلاعاتشون لیست شدن و خروجی دستور به جای نمایش , در یک فایل ریخته شده , که اخر اسم اون فایل مقدار متغیرمون قرار گرفته

    نکته مهم در مورد این قابلیت اینه که وقتی از این روش استفاده میکنید , دستور در ساب شل اجرا میشه و این باعث میشه به متغیر های لوکال اسکریپت دسترسی نداشته باشه , حواستون باشه که در صورت لزوم متغیر رو ارتقا بدید


    هدایت خروجی :

    ساده ترین حالت هدایت , فرستادن خروجی یک دستور به فایل هستش

    که شل بش از علامت بزرگتر برای این موضوع استفاده میکنه :

command > outputfile

$ date > test6
$ ls -l test6
-rw-r--r--    1 rednaxela     rednaxela           29 Feb 10 17:56 test6

$ cat test6
    Thu Feb 10 17:56:58 EDT 2019


    اگه فایل مقصد از قبل وجود داشته باشه , خروجی روی اون فایل نوشته میشه :
 

$ who > test6
$ cat test6

    rednaxela     pts/0    Feb 10 17:55
    Thu Feb 10 18:02:14 EDT 2019


    هدایت ورودی :

    در این حالت برعکس موضوع قبل از علامت کوچکتر استفاده میشه

    که به جای اینکه خروجی یک دستور به فایل هدایت بشه , محتوای یک فایل به عنوان ورودی به دستور هدایت میشه :

command < inputfile
                   
$ wc < test6
    2      11      60


    در مثال بالا دستور فایل رو به عنوان ورودی دریافت کرده و مقدارش رو شمرده , که میگه 2 خط و 11 کلمه و 60 بایت در فایل وجود داره

    روش بعدی ، هدایت ورودی اینلاین نام داره
    که شما مقادیری مثل محتوای یک فایل رو بدون استفاده از فایل مستقیم به خود شل میدید , فرمت و مثال :

command << marker
data
marker
    
    $ wc << xx
    > test string 1
    > test string 2
    > test string 3
    > xx
    3       9      42



    پایان قسمت اول از بخش دوم

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

بخش دوم - قسمت دوم


    استفاده از پایپ ها :

    بعضی وقتا شما نیاز دارید خروجی یک دستور رو به عنوان ورودی به یک دستور دیگه بدید
    این کار از طریق هدایت خروجی و ورودی که قبلا گفتیم شدنیه ولی راه اصلی نیست

  $ rpm -qa > rpm.list
    $ sort < rpm.list
    abrt-1.1.14-1.fc14.i686
    abrt-addon-ccpp-1.1.14-1.fc14.i686
    abrt-addon-kerneloops-1.1.14-1.fc14.i686
    abrt-addon-python-1.1.14-1.fc14.i686
    abrt-desktop-1.1.14-1.fc14.i686
    abrt-gui-1.1.14-1.fc14.i686
    abrt-libs-1.1.14-1.fc14.i686
    abrt-plugin-bugzilla-1.1.14-1.fc14.i686
    abrt-plugin-logger-1.1.14-1.fc14.i686
    abrt-plugin-runapp-1.1.14-1.fc14.i686
    acl-2.2.49-8.fc14.i686 
    [...]


    راه اصلی استفاده از پایپ ها یا همون روش پایپینگه , فرمت و مثال :

  command1 | command2
  
  
    $ rpm -qa | sort
    abrt-1.1.14-1.fc14.i686
    abrt-addon-ccpp-1.1.14-1.fc14.i686
    abrt-addon-kerneloops-1.1.14-1.fc14.i686
    abrt-addon-python-1.1.14-1.fc14.i686
    abrt-desktop-1.1.14-1.fc14.i686
    abrt-gui-1.1.14-1.fc14.i686
    abrt-libs-1.1.14-1.fc14.i686
    abrt-plugin-bugzilla-1.1.14-1.fc14.i686
    abrt-plugin-logger-1.1.14-1.fc14.i686
    abrt-plugin-runapp-1.1.14-1.fc14.i686
    acl-2.2.49-8.fc14.i686 
    [...]

 
    میبینید که خروجی همونه , در این حالت خروجی دستور اول ورودی دستور دومه

    برای پایپینگ میتونید از دستورات بیشتری هم استفاده کنید

$ rpm -qa | sort | more

$ rpm -qa | sort > rpm.list
$ more rpm.list

    
    موضوع مهم بعدی که در همه زبان های برنامه نویسی اهمیت داره , ریاضیات هستش

    دو راه برای اعمال ریاضیات در بش اسکریپت وجود داره
    روش اول استفاده از دستور expr

   expr 1 + 5


    این دستور تعدادی عملگر رو میشناسه که در لیست زیر میتونید ببینید

ARG1  |  ARG2

ARG1  &  ARG2

ARG1  <  ARG2

ARG1  <= ARG2

ARG1  =  ARG2

ARG1  != ARG2

ARG1  >= ARG2

ARG1  >  ARG2

ARG1  +  ARG2

ARG1  -  ARG2

ARG1  *  ARG2

ARG1  /  ARG2

ARG1  %  ARG2

 

    البته به صورت نرمال نمیتونید ازشون استفاه کنید , چون  اکثرا  این کاراکتر ها در شل معنای دیگه ای دارن , به همین دلیل از بک اسلش استفاده میشه 

    $ expr 5 * 2
    expr: syntax error
    
    $ expr 5 \* 2
    10
    
    
    $ cat test6
    #!/bin/bash
    # mesale estefade az dastoore expr
    var1=10
    var2=20
    var3=$(expr $var2 / $var1)
    echo natije mishe : $var3


    khorooji =>
    
    $ chmod u+x test6
    $ ./test6
    natije mishe : 2


مثال زیر روش دوم برای انجام ریاضیاته که معمولا از اون روش استفاده میکنیم , به همین دلیل روش اول رو صرفا در حد اشنایی توضیح دادم


    روش دوم استفاده از براکت ها :

    این روش ساده تر و جامع تره , مثال زیر رو ببینید

    $ var1=$[1 + 5]
    $ echo $var1
    6
    
    $ var2=$[$var1 * 2]
    $ echo $var2
    12
    
    
    $ cat test7
    #!/bin/bash
    var1=100
    var2=50
    var3=45
    var4=$[$var1 * ($var2 - $var3)]
    echo javabe nahayi mishe : $var4
    
    
    khorooji =>
    
    $ chmod u+x test7
    $ ./test7
    javabe nahayi mishe : 500


    میبینید که در این حالت حتی نیازی نیست نگران معنیه کاراکتر ها در شل بشید , خود شل به دلیل اینکه کاراکتر ها داخل براکت هستند هدف مارو تشخیض میده

    نکته بعدی که باید حل بشه محدودیت اعداد صحیح هستش
    شما میتونید از چند روش برای حل کردن موضوع استفاده کنید

    محدودیت اعداد صحیص رو در مثال زیر میتونید ببینید :

$ cat test8
#!/bin/bash
#
var1=100
var2=45
var3=$[$var1 / $var2]
#
echo javabe nahayi mishe : $var3


khorooji =>

$ chmod u+x test8
$ ./test8
javabe nahayi mishe : 2


    پر استفاده ترین روش ، استفاده از ماشین حساب داخلیه بش هستش bc

$ bc
Copyright 1991-1994, 1997, 1998, 2000, 2004, 2006 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type 'warranty'.
12 * 5.4
64.8
3.156 * (3 + 5)
25.248
quit


    نمونه های اعشاری رو که مشاهده کردید , بعد از اتمام کار برای خارج شدن از محیط ماشین حساب باید دستور quit رو تایپ کنید
    اعشار این ماشین حساب توسط یک متغیر درونی کنترل میشه , به نام scale

    شما میتونید با تغیر مقدار این متغیر خروجی محاصباتتون رو جوری که میخواید بگیرید

$ bc -q
3.44 / 5
0
scale=4
3.44 / 5
.6880
quit



    اینجا ما مقدار 4 رو به متغیر دادیم و اعشارمون طبق سفارشمون داده شد

    قبل از شروع کار ، بنر برنامه رو برای تمیز بودن صفحه رد کردیم با اپشن -q

    ضمن مثال بالا , این ماشین حساب متغیر هارو هم میشناسه

$ bc -q
var1=10
var1 * 4
40
var2 = var1 / 5
print var2
2
quit


    استفاده از ماشین حساب بش در اسکریپت :

    اختصاص خروجیه دستور به متغیر رو یاتونه ؟ این همون راه استفاده در اسکریپتمونه , فرمت و مثال :

variable=$(echo "options; expression" | bc)  

$ cat test9
#!/bin/bash
var1=$(echo "scale=4; 3.44 / 5" | bc)
echo javab mishe : $var1


khorooji =>

$ chmod u+x test9
$ ./test9
javab mishe : .6880


    همونطور که دیدید , اول مقدار متغیر ماشین حساب رو 4 قرار دادیم , بعد مقدار محاصبه رو وارد کردیم , که تمام این به جای چاپ شدن با استفاده از پایپینگ به عنوان ورودی تزریق شد به ماشین حساب , و خروجی نهایی مراحل انجام شده در متغیر ما ریخته میشه


    شما میتونید به جای خود اعداد از متغیر ها هم استفاده کنید :

    $ cat test10
    #!/bin/bash
    #
    var1=100
    var2=45
    #
    var3=$(echo "scale=4; $var1 / $var2" | bc)
    echo javab mishe : $var3
    
    
    khorooji =>
    
    $ ./test10
    javab mishe : 2.2222

 

$ cat test11
#!/bin/bash
#
var1=20
var2=3.14159
#
var3=$(echo "scale=4; $var1 * $var1" | bc)
var4=$(echo "scale=4; $var3 * $var2" | bc)
echo javab mishe : $var4


    وقتایی که مقادیر طولانی دارید به ترتیب زیر هم میشه مقادیر رو وارد کرد :
 

    var1=$(bc << xx
    options
    statements
    expressions
    xx
    )
    
    
    $ cat test12
    #!/bin/bash
    #
    var1=10.46
    var2=43.67
    var3=33.2
    var4=71
    #
    var5=$(bc << EOF
    scale = 4
    a1 = ( $var1 * $var2)
    b1 = ($var3 * $var4)
    a1 + b1
    EOF
    )
    echo javab mishe : $var5


    چک کردن exit status 

    هر دستوری که در شل اجرا میشه یه کد وضعیت اتمام داره که بعد از اتمام پروسه به شل تحویل داده میشه تا نتیجه کارش مشخص بشه

    این کد یه عدد بین 0 تا 255 هستش , شما میتونید از این عدد توی اسکریپت هاتون استفاده کنید

    لینوکس متغیری با نام علامت سوال فراهم میکنه که مقدار کد مربوط به اخرین دستور اونجا نگهداری میشه , شما باید به محض اتمام کار دستور ، از مقدار استفاده کنید :

$ date
Sat Jan 15 10:01:30 EDT 2019
$ echo $?
0


    همونطور که میبینید کد وضعیت برای اجرای درست دستور میشه صفر , اگه اجرا با مشگلی مواجه بشه , کد از حالت صفر خارج میشه و بسته به شرایط مقدار میگیره , مثل :

$ asdfg
—bash: asdfg: command not found
$ echo $?
127


    چند تا نمونه از کدهای وضعیت خارج از صفر براتون میزارم بهتر اشنا بشید با موضوع


    1
    ارور ناشناخته عمومی

    2
    استفاده نادرست از دستور شل 

    126
    دستور نمیتونه اجرا بشه

    127
    دستور پیدا نشد 

    128

    ارگمان خروج نا معتبر 

    128+x
    ارور مهم با لینوکس سیگنال اکس

    130
    وقتی دستور در حال اجرا بوده کنترل سی انجام شده 

    255 
    کد خارج از محدوده


    در مثال زیر کد 126 میگه که یوزر پرمیشن مناسب رو نداره

$ ./myprog.c
—bash: ./myprog.c: Permission denied
$ echo $?
126


    نمونه متعارف بعدی که بعد از استفاده از پارامتر نامعتبر رخ میده

$ date %t
date: invalid date '%t'
$ echo $?
1


    دستور exit

    با استفاده از این دستور میتونیم به جای کد پیش فرض صفر برای اجرای مناسب , کد خودمونو بزاریم :
 

    $ cat test13
    #!/bin/bash
    # test kardane exit status
    var1=10
    var2=30
    #
    var3=$[$var1 + $var2]
    echo javab mishe : $var3
    #
    exit 5
    
    
    khorooji =>
    
    $ chmod u+x test13
    $ ./test13
    javab mishe : 40
    $ echo $?
    5

 

    البته میتونید از متغیر هم برای مقدار دهی استفاده کنید :
  

    $ cat test14
    #!/bin/bash
    # test kardane exit status
    var1=10
    var2=30
    var3=$[$var1 + $var2]
    #
    exit $var3
    
    
    khorooji =>
    
    $ chmod u+x test14
    $ ./test14
    $ echo $?
    40

 

    فقط مواضب باشید اینجور موقع ها جواب محاسبات بیشتر از 255 نشه , وگرنه مقدار مونده رو از اول دور میزنه , به مثال زیر توجه کنید :

    $ cat test14b
    #!/bin/bash
    # test kardane exit status
    var1=10
    var2=30
    var3=$[$var1 * $var2]
    echo javab mishe : $var3
    #
    exit $var3
    
    
    khorooji =>
    
    $ ./test14b
    javab mishe : 300
    $ echo $?
    44

 

پایان قسمت دوم از بخش دوم

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

    بخش دوم - قسمت سوم


    IF - THEN شرط :

    ساده ترین نوع شرط محسوب میشه , که میتونیم برای ایجاد شروط در اسکریپت استفاده کنیم , به فرمتش دقت کنید :

if command
   then
   commands
fi


    در سایر زبان های برنامه نویسی ابجکتی که بعد از if میاد , بیانگر درست یا غلط بودن موضوعه
    اما این روشی نیست که شل بش ازش استفاده میکنه
    در شل بش دستور خط if اجرا میشه و در صورتی که کد وضعیت اجرای دستور صفر بود , دستورات بخش then اجرا میشن , و شل میره سراغ ادامه اسکریپت , fi هم اعلام پایان بخش شرطه , مثال زیر رو ببینید :

$ cat test1.sh
#!/bin/bash
# teste sharte if
    if pwd
    then
    echo "shart kar kard"
    fi


khorooji =>

    $ ./test1.sh
    /home/rednaxela
    shart kar kard

 

 اسکریپت از دستور نمایش مسیر فعلی به عنوان شرط استفاده میکنه , در صورتی که کد وضعیت اجرای دستور صفر باشه , یا بهتره بگیم دستور با موفقیت اجرا بشه , درخواست ما که نمایش پیام هست انجام میشه , یه مثال دیگه میزنیم :

$ cat test2.sh
#!/bin/bash
# teste dastoore ghalat
    if man-dastoor-nistam
    then
    echo "shart kar kard"
    fi
    echo "ma biroone shart hastim"
    
    
$ ./test2.sh
./test2.sh: line 3: man-dastoor-nistam: command not found
ma biroone shart hastim


    در این مثال ما برای شرط از یک دستور نا معتبر استفاده کردیم , و چون دستور درست اجرا نشد کد وضعیت اجرا صفر نبود , و همین باعث شد بخش درخواستیه ما که شامل نمایش پیام بود اجرا نشه
    شما میتونید برای اجرای دستورات شرط چندین دستور قرار بدید , که در صورت درست بودن شرط همشون اجرا بشن

$ cat test3.sh
#!/bin/bash
# teste chand dastoor baraye bakhshe then
#
    testuser=rednaxela
    if grep $testuser /etc/passwd
    then
    echo "avalin dastoor ejra shod"
    echo "dovomin dastoor ejra shod"
    echo "sevomin dastoor ejra shod"
    ls -a /home/$testuser/.b*
    fi


    شرط از دستور grep برای سرچ کردن فایل استفاه میکنه , که ایا مقدار متغیر ما در فایل هست یا نه
    در صورتی که مقدار وجود داشته باشه کد وضعیت اجرای دستور صفر داده میشه و دستورات درخواستیه ما به ترتیب اجرا میشن

$ ./test3.sh
rednaxela:x:501:501:red naxela:/home/rednaxela:/bin/bash
avalin dastoor ejra shod
dovomin dastoor ejra shod
sevomin dastoor ejra shod
/home/rednaxela/.bash_history   /home/rednaxela/.bash_profile
/home/rednaxela/.bash_logout   /home/rednaxela/.bashrc

 

    مثال زیر نمونه منفی دستور بالاس :

$ cat test3.sh
#!/bin/bash
# teste chand dastoor baraye bakhshe then
#
    testuser=Nouser
    if grep $testuser /etc/passwd
    then
    echo "avalin dastoor ejra shod"
    echo "dovomin dastoor ejra shod"
    echo "sevomin dastoor ejra shod"
    ls -a /home/$testuser/.b*
    fi
    
    
$ ./test3.sh
$


    IF - THEN - ELSE :

    در نمونه های قبل شما فقط یک اپشن داشتید , فقط در صورتی که کد صفر دریافت میشد دستورات اجرا میشدن  
    در غیر این صورت اسکریپت دستورات بیرون از شرط رو ادامه میداد
    ولی در این بخش شما میتونید دستوراتی رو برای وقتی کد وضعیت غیر از صفر بود تعریف کنید , فرمت و مثال :
 

    if command
    then
    commands
    else
    commands
    fi

$ cat test4.sh
#!/bin/bash
# teste else
#
    testuser=nouser
    if grep $testuser /etc/passwd
    then
    echo "user dar system vojood darad"
    ls -a /home/$testuser/.b*
    echo
    else
    echo "user $testuser dar system sabt nashode."
    echo
    fi
    

$ ./test4.sh
user nouser dar system sabt nashode.


    استفاده از شرط ها درون شرط های دیگه :

    بعضی وقتا شما نیاز دارید چند مورد رو در اسکریپتتون چک کنید , مثال زیر :

$ cat test5.sh
#!/bin/bash
# estefade az if daroone yek if dg
#
    testuser=nouser
    if grep $testuser /etc/passwd
    then
    echo "user $testuser dar system sabt shode"
    else
    echo "user $testuser dar system sabt nashode"
        if ls -d /home/$testuser/
        then
        echo "vali $testuser yek directory dare"
        fi

    fi
    
    
$ ./test5.sh
user nouser dar system sabt nashode
/home/nouser/
vali nouser yek directory dare


    به جای استفاده از if - then های جدا از هم شما میتونید از elif استفاده کنید ,  فرمت و مثال :

if command1
then
commands
elif command2
then
more commands
fi

    $ cat test5.sh
    #!/bin/bash
    # Teste elif
    #
    testuser=nouser
    if grep $testuser /etc/passwd
    then
    echo "user $testuser dar system sabt shode"
    #
    elif ls -d /home/$testuser
    then
    echo "user $testuser dar system sabt nashode"
    echo "vali $testuser yek directory dare"
    fi
    

    $ ./test5.sh
    /home/nouser
    user nouser dar system sabt nashode
    vali nouser yek directory dare


    یک مثال دیگه , این بار همراه با else :

$ cat test5.sh
#!/bin/bash
# Teste elif ba else
#
    testuser=nouser
    if grep $testuser /etc/passwd
    then
    echo "user $testuser dar system sabt shode"
    #
    elif ls -d /home/$testuser
    then
    echo "user $testuser dar system sabt nashode"
    echo "vali $testuser yek directory dare"
    #
    else
    echo "user $testuser dar system sabt nashode"
    echo "va user $testuser directory ham nadare"
    fi
    
    
$ ./test5.sh
/home/nouser
user nouser dar system sabt nashode
vali nouser yek directory dare
    
   


    شما همچنین میتونید از elif های متوالی استفاده کنید :

if command1
    then
    command set 1
elif command2
    then
    command set 2
elif command3
    then
    command set 3
elif command4
    then
    command set 4
fi


    دستور test برای if :
    تا اینجا شما داخل شرط فقط دستورات ساده بش رو دیدید , حتما فکر کردید ممکنه به جای قرار دادن این ستورات شرط مد نظر خودمون رو بزاریم و درست یا غلط بون شرط ما نتیجه رو مشخص کنه نه کد وضعیت اجرای دستور

    دستور test راهی فراهم میکنه تا شرط های متفاوت با اونایی که تا الان دیدید اعمال کنیم
    اگه شرط هایی که با این دستور گذاشته میشن درست باشن  , دستور با مقدار کد وضعیت اجرای صفر به اتمام میرسه , و چون دستور test داخل if قرار داره
    دستور مثل واسط میانی عمل کرده و کد وضعیت اجرای خودش رو به if میده
    که خروجی این فرایند باعث میشه شرط مثل شرط های سایر زبان های برنامه نویسی عمل کنه

    فرمت کاملا مثل قبل میمونه فقط test اضافه شده , فرمت و مثال :

if test condition
then
commands
fi


$ cat test6.sh
#!/bin/bash
# Teste dastoore test
#
    my_variable="FULL"
    if test $my_variable
    then
    echo " moteghayer daraye meghdare : $my_variable "
    #
    else
    echo "moteghayer khaliye"
    fi
    

    $ ./test6.sh
    moteghayer daraye meghdare : FULL


    در مثال بالا دستور متغیر رو چک کرده و چون متغیر وجود داشته و مقدار داشته و مشگلی نبوده , دستور با کد وضعیت اجرای صفر به پایان رسیده و شرط با دریافت کد صفر پیش رفته


    و اما روش جایگزین test 
    شما میتونید به جای استفاده از دستور test از براکت ها استفاده کنید
    هر شرطی که داخل براکت باشه مثل استفاده از دستور test عمل میکنه
    حتما باید بین شرط و براکت ها فاصله گذاشته بشه , فرمت :

if [ condition ]
then
commands
fi



    پایان قسمت سوم از بخش دوم

 

 

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

بخش دوم - قسمت چهارم


برای استفاده از شرط ها میتونیم اونارو لایه بندی کنیم :

    [ condition1 ] && [ condition2 ]
    [ condition1 ] || [ condition2 ]


    از نمونه اول برای متصل کردن شروط به هم استفاده میشه , که در صورت اوکی بودن هر دو شرط شرایط به سمتی که میخواید بره

    نمونه دوم میگه هر کدوم از شرط ها اوکی بود قضیه حله


    توضیح دابل پرانتز ها و دابل براکت ها [[   ]] ((   ))

    از دابل پرانتز ها برای محاسبات پیچیده تر عددی استفاده میشه , مثال زیر رو ببینید :

    $ cat test23.sh
    #!/bin/bash
    #
    val1=10
    if (( $val1 ** 2 > 90 ))
    then
    (( val2 = $val1 ** 2 ))
    echo "$val1 be tavane 2 mishe : $val2"
    fi
    
    
    $ ./test23.sh
    10 be tavane 2 mishe : 100


    و به همین ترتیب از دابل براکت ها برای مقایسات رشته ای استفاده میکنیم , مثلا : 

    $ cat test24.sh
    #!/bin/bash
    #
    if [[ $USER == r* ]]
    then
    echo "Hello $USER"
    else
    echo "shoma shenakhte nashodid"
    fi
    
    
    $ ./test24.sh
    Hello red


    فرمت زیر و فرایند رفتارش برای اجرای شرط های مورد نظر ما و ایجاد کد وضعیت اجرای صفر برای ادامه شرط رو که یادتونه 

    if [ condition ]
    then
    commands
    fi


    در این موضوع از سه کلاس رفتاری تبعیت میشه :

    مقایسات عددی
    مقایسات رشته ای
    مقایسات فایلی


    استفاده از کلاس مقایسات عددی :

    مرسوم ترین متد های های این کلاس رو در بخش زیر براتون لیست کرم


    n1 -eq n2
    چک میکنه عدد1 برابره با عدد2 یا نه 

    n1 -ge n2
    چک میکنه عدد1 برابر یا بزرگتره از عدد2 یا نه

    n1 -gt n2
    چک میکنه عدد1 بزرگتره از عدد2 یا نه 

    n1 -le n2
    چک میکنه عدد1 برابر یا کوچکتره از عدد2 یا نه 

    n1 -lt n2
    چک میکنه عدد1 کوچکتره از عدد2 یا نه

    n1 -ne n2

    چک میکنه عدد1 نابرابره با عدد2 یا نه


    این کلاس میتونه هم برای اعداد و هم متغیر های حاوی اعداد استفاده بشه , مثال :

    $ cat numeric_test.sh
    #!/bin/bash
    #
    value1=10
    value2=11
    #
    if [ $value1 -gt 5 ]
    then
    echo "meghdare : $value1 bozorgtare az 5"
    fi
    #
    if [ $value1 -eq $value2 ]
    then
    echo "maghadir barabar hastand"
    else
    echo "maghadir nabarabar hastand"
    fi
    
    
    $ ./numeric_test.sh
    meghdare : 10 bozorgtare az 5
    maghadir nabarabar hastand


    نکته مهم در مورد این کلاس اینه که از اعشار پشتیبانی نمیکنه , مثال :

    $ cat floating.sh
    #!/bin/bash
    #
    value1=5.555
    echo "meghdare test : $value1"
    #
    if [ $value1 -gt 5 ]
    then
    echo "meghdare : $value1 bozorgtare az 5"
    fi
    
    
    $ ./floating.sh
    meghdare test : 5.555
    ./floating.sh: line 8:
    [: 5.555: integer expression expected


    یادتون باشه خود شل بش تنها از اعداد صحیح استفاه میکنه

 

    استفاده از کلاس مقایسات رشته ای :

    مرسوم ترین متد های های این کلاس رو در بخش زیر براتون لیست کرم


    str1 = str2
    چک میکنه رشته1 برابره با رشته2 یا نه 

    str1 != str2
    چک میکنه رشته1 نابرابره با رشته2 یا نه

    str1 < str2
    چک میکنه رشته1 کوچکتره از رشته2 یا نه

    str1 > str2
    چک میکنه رشته1 بزرگتره از رشته2 یا نه

    n str1-
    چک میکنه رشته1 طولش بیشتر از صفره یا نه

    z str1-
    چک میکنه رشته1 طولش صفره یا نه

    مثال :

    $ cat test7.sh
    #!/bin/bash
    testuser=rednaxela
    if [ $USER = $testuser ]
    then
    echo "Welcome $testuser"
    fi
    

    $ ./test7.sh
    Welcome rednaxela


    همونطور که دیدید مثال بالا برابر بودن دو مقدار رشته ای رو مقایسه کرد , برعکسش میشه مثال پایین :

    $ cat test8.sh
    #!/bin/bash
    testuser=baduser
    if [ $USER != $testuser ]
    then
    echo "user : $testuser nist"
    else
    echo "Welcome $testuser"
    fi
    
    
    $ ./test8.sh
    user baduser nist


    نمونه دیگه از مقایسه رشته ای , این بار مقایسه اندازه :

    توجه داشته باشید به نماد کوچکتر بزرگتر که اینجا استفاده میکنیم
    حتما یادتون میاد که از این نماد ها برای هدایت ورودی و خروجی استفاده میکریم , اگه اینجا با بک اسلش کار اصلیشون رو غیر فعال نکنیم مشگل زیر پیش میاد

    $ cat badtest.sh
    #!/bin/bash
    #
    val1=baseball
    val2=hockey
    if [ $val1 > $val2 ]
    then
    echo "$val1 bozorgtare az $val2"
    else
    echo "$val1 koochektare az $val2"
    fi
    
    
    $ ./badtest.sh
    baseball bozorgtare az hockey
    $ ls -l hockey
    -rw-r--r--    1 rednaxela     rednaxela          0 Sep 30 19:08 hockey


    به دستور شرط و خروجیه جالبش دقت کردید ؟

    ببینید اینجا شرط مدنظر ما به هیچ عنوان انجام نشده , پس چرا ظاهرا مقایسه بین دو رشته صورت گرفته و حتی مقدار درست هم نمایش داده شده ؟؟؟؟؟

    در قسمت شرط شل علامت بزرگتر ما و کلا شرط مدنظر ما رو کاملا انکار کرده و از علامت بزرگتر به عنوان علامت هدایت دیتا استفاده کرده , که یعنی اومده مقدار متغیر اول رو ریخته تو یه فایل که از مقدار متغیر دوم به عنوان اسم اون فایل برای ایجادش استفاده کرده

و چون عملی که انجام شده به هر حال درست انجام شده یک کد وضعیت اجرای صفر به شرط داده شده و بنابراین اسکریپت به طور عادی ادامه پیدا کرده و پیام قسمت اول شرط نمایش داده شده و چون کاملا تصادفی متغیر اولی مقدارش بزرگتر بوده ما در خروجی همه چیز رو در مورد شرط درست میبینیم

    به جز اینکه میتونیم فایل ساخته شده و مقدارش رو ببینیم
    برای حل این مشگل میتونید از بک اسلش استفاده کنید , مثال زیر :

$ cat test9.sh
#!/bin/bash
#
    val1=baseball
    val2=hockey
    if [ $val1 \> $val2 ]
    then
    echo "$val1 bozorgtare az $val2"
    else
    echo "$val1 koochektare az $val2"
    fi
    
    
    $ ./test9.sh
    baseball bozorgtare az hockey


    نکته بعدی در رابطه با این نوع مقایسه تفاوت حروف کوچک و بزرگه :

$ cat test9b.sh
#!/bin/bash
#
    val1=Testing
    val2=testing
    if [ $val1 \> $val2 ]
    then
    echo "$val1 bozorgtare az $val2"
    else
    echo "$val1 koochektare az $val2"
    fi
    
    
    $ ./test9b.sh
    Testing koochektare az testing


    از دو مورد اخر لیستمون هم برای اینکه ببینیم دیتایی وجود داره یا نه استفاده میکنیم , مثال زیر :

$ cat test10.sh
#!/bin/bash
#
    val1=testing
    val2=''
    if [ -n $val1 ]
    then
    echo "reshte ye '$val1' vojood dare"
    else
    echo "reshteyi dar val1 vojood nadare"
    fi
    #
    if [ -z $val2 ]
    then
    echo "reshteyi dar val2 vojood nadare"
    else
    echo "reshte ye $val2 vojood dare"
    fi
    
    
    $ ./test10.sh
    reshte ye testing vojood dare
    reshte yi dar val2 vojood nadare

 

    استفاده از سومین نوع , کلاس مقایسات فایل و مورد های مربوطه رو به دلیل طولانی بودن در قسمت بعد بهش میپردازیم

 

    پایان قسمت چهارم از بخش دوم

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

    بخش دوم - قسمت پنجم


    کلاس مقایسات فایل :

    این متد به شما اجازه میده وضعیت فایل ها و دایرکتوری هارو تست کنید :


    d dir-name-
    چک میکنه ایا چنین ابجکتی وجود داره , و اگه وجود داره ایا دایرکتوریه

    e file-
    چک میکنه ایا چنین ابجکتی وجود داره  

    f file-
    چک میکنه ایا چنین ابجکتی وجود داره , و اگه وجود داره ایا فایله

    r file-
    چک میکنه ایا چنین ابجکتی وجود داره , و اگه وجود داره ایا قابل خوندنه

    s file-
    چک میکنه ایا چنین ابجکتی وجود داره , و اگه وجود داره ایا مقدار داره

    w file-
    چک میکنه ایا چنین ابجکتی وجود داره , و اگه وجود داره ایا قابل نوشتنه

    x file-
    چک میکنه ایا چنین ابجکتی وجود داره , و اگه وجود داره ایا  قابل اجراست

    O file-
    چک میکنه ایا چنین ابجکتی وجود داره , و اگه وجود داره ایا مال یوزر فعلیه

    G file-
    چک میکنه ایا چنین ابجکتی وجود داره , و اگه وجود داره ایا با یوزر فعلی هم گروهه

    file1 -nt file2
    چک میکنه ایا فایل1 جدید تره از فایل2

    file1 -ot file2
    چک میکنه ایا فایل1 قدیمی تره از فایل2


    این ابزار ها باعث میشه شما قابلیت چک کردن فایل سیستم رو با شل اسکریپت داشته باشید , مثال ها به ترتیب :


    چک کردن دایرکتوری :
    

$ cat test11.sh
#!/bin/bash
#
    jump_directory=/home/redd
    if [ -d $jump_directory ]
    then
    echo "directory : $jump_directory vojood dare"
    cd $jump_directory
    ls
    else
    echo "directory : $jump_directory vojood nadare"
    fi
    
   
$ directory : /home/redd vojood danare
$


    چک کردن موجودیت یک ابجکت :

$ cat test12.sh
#!/bin/bash
#
    location=$HOME
    file_name="target"
    #
    if [ -e $location ]
    then
    echo "directory : $location vojood dare"
    echo "file $file_name ro check mikonim"
    #
    if [ -e $location/$file_name ]
    then
    echo "file $file_name vojood dare"
    echo "dar hale Update tarikhe hazer ..."
    date >> $location/$file_name
    #
    else
    echo "File vojood nadare"
    echo "tarikh update nashod"
    fi
    #
    else
    echo "directory : $location vojood nadare"
    echo "tarikh update nashod"
    fi
    
    
$ ./test12.sh
directory : /home/rednaxela vojood dare
file target ro check mikonim
File vojood nadare
tarikh update nashod


$ touch tartget
    $ ./test12.sh
    directory : /home/rednaxela vojood dare
    file target ro check mikonim
    file target vojood dare
    dar hale Update tarikhe hazer ...

 

    چک کردن فایل :

$ cat test13.sh
#!/bin/bash
#
    item_name=$HOME
    echo
    echo "item : $item_name check mishe"
    echo
    if [ -e $item_name ]
    then
    echo "item : $item_name vojood dare"
    echo "ama aya yek file hastesh ?"
    echo
    if [ -f $item_name ]
    then
    echo "bale $item_name yek file hastesh"
    #
    else
    echo "na $item_name file nist"
    fi
    #
    else
    echo "item : $item_name vojood nadare"
    fi
    
    
$ ./test13.sh
item : /home/rednaxela check mishe
item : /home/rednaxela vojood dare
ama aya yek file hastesh ?
na /home/rednaxela file nist


    چک کردن قابل خوندن بودن :

$ cat test14.sh
#!/bin/bash
#
    pwfile=/etc/shadow
    #
    if [ -f $pwfile ]
    then
    if [ -r $pwfile ]
    then
    tail $pwfile
    else
    echo "file : $pwfile ghabele khoondan nist"
    fi
    else
    echo "file : $pwfile vojood nadare"
    fi
    
    
$ ./test14.sh
file : /etc/shadow ghabele khoondan nist


    چک کردن موجودیت مقدار فایل :

$ cat test15.sh   
#!/bin/bash
#
    file_name=$HOME/file1
    #
    if [ -f $file_name ]
    then
    if [ -s $file_name ]
    then
    echo "file $file_name vojood dare va meghdar ham dare"
    echo "nemitoonim in file ro remove konim"
    else
    echo "file $file_name vojood dare vali khaliye"
    echo "removing file..."
    rm $file_name
    fi
    else
    echo "File $file_name vojood nadare"
    fi
    
    
$ ls -l $HOME/file1     -rw-rw-r--. 1 rednaxela rednaxela 29 Jun 25 05:32 /home/rednaxela/filel
  
    $ ./test15.sh
    file /home/rednaxela/filel vojood dare va meghdar ham dare
    nemitoonim in file ro remove konim


    چک کردن قابل نوشتن بودن :

$ cat test16.sh
#!/bin/bash
#
    item_name=$HOME/filel
    echo
    echo "dar hale check kardane : $item_name"
    echo
    if [ -f $item_name ]
    then
    if [ -w $item_name ]
    then 
    echo "dar hale neveshtane zamane hal dar : $item_name"
    date +%H%M >> $item_name
    #
    else 
    echo "file : $item_name ghabele neveshtan nist"
    fi
    #
    else
    echo "$item_name file nist"
    fi
    
    
$ ls -l filel    -rw-rw-r--  1 rednaxela rednaxela 0 Jun 27 05:38 filel

    $ ./test16.sh
    dar hale check kardane : /home/rednaxela/file1
    dar hale neveshtane zamane hal dar : /home/rednaxela/filel
    
    $ cat filel
    0543


    چک کردن قابل اجرا بودن :

$ cat test17.sh
#!/bin/bash
#
    if [ -x test16.sh ]
    then
    echo "shoma mitoonid script ro ejra konid"
    ./test16.sh
    else
    echo "script ghabele ejra nist"
    fi
    
    
$ ./test17.sh
shoma mitoonid script ro ejra konid
[...]
    
    $ chmod u-x test16.sh
    $
    $ ./test17.sh
    script ghabele ejra nist


    چک کردن مالکیت ابجکت :

$ cat test18.sh
#!/bin/bash
#
    if [ -O /etc/passwd ]
    then
    echo "shoma sahebe : /etc/passwd hastid"
    else
    echo "shoma sahebe : /etc/passwd nistid"
    fi
    
    
$ ./test18.sh
shoma sahebe : /etc/passwd nistid


    چک کردن تعلق به گروه :

$ cat test19.sh
#!/bin/bash
#
    if [ -G $HOME/testing ]
    then
    echo "shoma dar yek gorooh hastid"
    else
    echo "shoma dar yek gorooh nistid"
    fi
    
    
$ ls -l $HOME/testing    -rw-rw-r-- 1 rednaxela rednaxela 58 2019-07-30 15:51 /home/rednaxela/testing

    $ ./test19.sh
    shoma dar yek gorooh hastid
 
 
    $ chgrp sharing $HOME/testing
    $
    $ ./test19
    shoma dar yek gorooh nistid


    مقایسه جدید تر بودن و قدیمی تر بودن فایل ها :

$ cat test20.sh
#!/bin/bash
#
    if [ test19.sh -nt test18.sh ]
    then
    echo "file test19 jadid tare az test18"
    else
    echo "file test18 jadid tare az test19"
    fi
    #
    if [ test17.sh -ot test19.sh ]
    then
    echo "file test17 ghadimi tare az test19"
    fi
    
    
$ ./test20.sh
file test19 jadid tare az test18
file test17 ghadimi tare az test19

$ ls -l test17.sh test18.sh test19.sh 
-rwxrw-r-- 1 rednaxela rednaxela 167 2019-07-30 16:31 test17.sh
-rwxrw-r-- 1 rednaxela rednaxela 185 2019-07-30 17:36 test18.sh
-rwxrw-r-- 1 rednaxela rednaxela 167 2019-07-30 17:50 test19.sh



    پایان قسمت پنجم از بخش دوم

 

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

بخش دوم - قسمت ششم


    استفاده از دستور case برای کوتاه کردن if-then-else :

    در بعضی شرایط مثل مثال زیر ما میتونیم از گیر دستورالعمل ها دربیایم و میانبر بزنیم یجورایی :

$ cat test25.sh
#!/bin/bash
#
    if [ $USER = "rednaxela" ]
    then
    echo "Welcome $USER"
    elif [ $USER = "red" ]
    then
    echo "Welcome $USER"
    elif [ $USER = "blue" ]
    then
    echo "Welcom $USER"
    elif [ $USER = "white" ]
    then
    echo "voroode shoma mojaz nist"
    else
    echo "user shoma sabt nashode"
    fi
    
    
$ ./test25.sh
Welcome rednaxela


    الکی تکرار کردن کد هارو در مثال بالا دیدید ؟ حالا کاربرد مثال اصلی رو بهتر متوجه میشید :

    استفاده از  case : 

    فرمت و مثال :

case variable in
pattern1 | pattern2) commands;;
pattern3) commands;;
*) commands;;
esac


    $ cat test26.sh
    #!/bin/bash
    # estefade az case baraye shoroote motevali
    #
    case $USER in
    rednaxela | red | blue)
    echo "Welcome $USER";;
    white)
    echo "voroode shoma mojaz nist";;
    *)
    echo "user shoma sabt nashode";;
    esac
    
    
$ ./test26.sh
Welcome rednaxela


    مشاهده کردید که چقدر کار ساده تر و تمیز تر انجام شد

    دقیقا مثل اسکریپت قبلی ورود سه یوزر اول مجاز بود , به یوزر چهارم پیام ممنوعیت داده شد
    و در نهایت برای هر مقدار ورودی دیگه ای پیام یوزر شما ثبت نشده داده شد


    حلقه ها :

    با استفاده از حلقه ها یاد میگیرید چطور پروسه هارو تکرار کنید


    دستور for :

    گاهی شما نیاز دارید بعضی دستورات تا زمان خاصی تکرار بشن , با استفاده از این دستور حلقه ای ساخته میشه که این کارو انجام میده , فرمت و مثال :

for var in list
do
commands
done


    $ cat test1
    #!/bin/bash
    #
    for var1 in red blue green white pink
    do
    echo range zibaye : $var1
    done
    
    
$ ./test1
range zibaye : red
range zibaye : blue
range zibaye : green
range zibaye : white
range zibaye : pink


    مشاهده کردید که متغیر در هر مرحله یکی از عناصر لیست رو به ترتیب نگه داشته و دستورات رو اجرا کرده و بعد عنصر بعدی
    بعد از اتمام لیست متغیر درون حلقه اخرین مقدار رو نگه میداره مگر اینکه تغیرش بدید , مثال زیر :

$ cat test1b
#!/bin/bash
# teste moteghayere daroone halghe
    for var1 in red blue green white pink
    do
    echo range zibaye : $var1
    done
    #
    echo "akharin rangi ke print kardim : $var1"
    var1=black
    echo "range jadid : $var1"
    
    
$ ./test1b
range zibaye : red
range zibaye : blue
range zibaye : green
range zibaye : white
range zibaye : pink
akharin rangi ke print kardim : pink
range jadid : black


    همینطور میتونید از متغیر ها به عنوان لیست برای حلقه استفاده کنید : 

$ cat test4
#!/bin/bash
#
    list="red blue green pink"
    list=$list" white"
    #
    for var1 in $list
    do
    echo "range zibaye : $var1"
    done
    
    
$ ./test4
range zibaye : red
range zibaye : blue
range zibaye : green
range zibaye : pink
range zibaye : white


    نمونه بعدی , استفاده از خروجی یک دستور به عنوان لیست در حلقه :

$ cat test5
#!/bin/bash
#
    for var in $(cat file)
    do
    echo "range zibaye : $var"
    done


    در مثال بالا مقادیر لیستمون در یک فایل ذخیره شده بوده , و ما اون فایل رو با دستور cat خوندیم , و مقدار خروجی دستور رو به عنوان ورودی دادیم به متغیر داخل حلقه , توجه داشته باشید که در مثال بالا مقدار فایل خط به خط خونده میشه , یعنی مثل متغیر در مثال قبلی مقادیر با فاصله از هم جدا نمیشن بلکه هر کدوم در یک خط جدا قرار میگیرن

 

    جدا کننده فیلد ها :

    متغیر محیطی IFS) internal field separator) مشخص میکنه چه چیزی مرز بین فیلد هاست

    به عنوان مثال به صورت پیش فرض فاصله , تب و خط جدید تعریف شدن
    مثلا اگه شما بخواید فقط خط جدید به عنوان بخش بندی فیلد ها در نظر گرفته بشه , مقدار متغیر رو به مقدار زیر تغیر بدید
    IFS=$'\n'

    اضافه کردن مثال بالا به اسکریپت , باعث میشه شل علامت های فاصله و تب رو به عنوان جدا کننده فیلد قبول نکنه

    در اسکریپت های طولانی ممکنه در هر بخشی مقدار مشخص شده ای رو برای جدا سازی فیلد ها لازم داشته باشید و نیاز به تغیر های متعدد در متغیر فعلی داشته باشید , برای این کار قبل از تغیر در متغیر از مقدارش نمونه گیری میکنیم

IFS.OLD=$IFS
IFS=$'\n'
< va har vaght lazem bood reset mikonim : >
IFS=$IFS.OLD


    بسته به نیازتون مقادیر مختلفی میشه تعریف کرد , به صورت تکی یا دسته جمعی

IFS=:
IFS=$'\n':;"


    خوندن دایرکتوری با wildcard ها :

    شما میتونید با استفاده از for فایل های دایرکتوری رو بخونید
    وقتی اسم کامل فایل یا مسیرش رو نمیدونید این موضوع کاربرد پیدا میکنه

$ cat test6
#!/bin/bash
#
    for file in /home/rednaxela/test/*
    do
    if [ -d "$file" ]
    then
    echo "$file yek directory hastesh"
    elif [ -f "$file" ]
    then
    echo "$file yek file hastesh"
    fi
    done
    
$ ./test6
/home/rednaxela/test/dir1 yek directory hastesh
/home/rednaxela/test/myprog.c yek file hastesh
/home/rednaxela/test/myprog yek file hastesh
/home/rednaxela/test/myscript yek file hastesh
/home/rednaxela/test/newdir yek directory hastesh
/home/rednaxela/test/newfile yek file hastesh 
/home/rednaxela/test/newfile2 yek file hastesh
/home/rednaxela/test/testdir yek directory hastesh
/home/rednaxela/test/testing yek file hastesh
/home/rednaxela/test/testprog yek file hastesh
/home/rednaxela/test/testprog.c yek file hastesh


    دقت کنید در مثال بالا مقدار متغیر فایل رو در شرط ها بین دابل کوتیشن گذاشتیم

    در صورتی که در بخش اموزشش چنین چیزی نگفته بودیم

    ما این کارو کردیم چون در لینوکس فاصله بین اسم ابجکت ها عادیه و این باعث شد در صورت فاصله دار بودن اسم هر کدوم از فایل هایی که مرور شدن , هیچ مشگلی پیش نیاد

    یک مثال پویا تر :

$ cat test7
#!/bin/bash
#
    for file in /home/rednaxela/.b* /home/rednaxela/badtest
    do
    if [ -d "$file" ]
    then
    echo "$file yek directory hastesh"
    elif [ -f "$file" ]
    then
    echo "$file yek file hastesh"
    else
    echo "$file vojood nadarad"
    fi
    done
    
    
$ ./test7
/home/rednaxela/.backup.timestamp yek file hastesh
/home/rednaxela/.bash_history yek file hastesh
/home/rednaxela/.bash_logout yek file hastesh
/home/rednaxela/.bash_profile yek file hastesh
/home/rednaxela/.bashrc yek file hastesh
/home/rednaxela/badtest vojood nadarad


    استفاه از استایل C برای for :

    در این حالت ما از دستور for در بش به سبک استفاده در زبان C الگو میگیریم

for (i = 0; i < 10; i++)
    {
    printf("shomare ye badi mishe : %d\n", i);
    }


    متغیر i در مثال بالا نقش شمارنده داره , که در اولین بخش مقدار پیش فرضش رو گرفته
    و در بخش دوم تا زمانی که مقدارش کوچکتر از 10 باشه حلقه ادامه پیدا میکنه
    و در بخش اخر متغیر بعد از هر بار مرور حلقه مقدارش افزایش پیدا میکنه

    و اما حالت زیر مثال اصلیمونه , فرمت و مثال :

for (( variable assignment ; condition ; iteration process ))
for (( a = 1; a < 10; a++ ))


    $ cat test8
    #!/bin/bash
    # teste C-style for 
    #
    for (( i=1; i <= 10; i++ ))
    do
    echo "shomare ye badi mishe : $i"
    done
    
    
$ ./test8
shomare ye badi mishe : 1
shomare ye badi mishe : 2
shomare ye badi mishe : 3
shomare ye badi mishe : 4
shomare ye badi mishe : 5
shomare ye badi mishe : 6
shomare ye badi mishe : 7
shomare ye badi mishe : 8
shomare ye badi mishe : 9
shomare ye badi mishe : 10


    شما میتونید در این فرمت از چند متغیر هم استفاده کنید , اما فقط یک شرط استفاده میشه , مثال :

$ cat test9
#!/bin/bash
# chand moteghayer
#
    for (( a=1, b=10; a <= 10; a++, b-- ))
    do
    echo "$a  -  $b"
    done
    
    
    $ ./test9
    1  -  10
    2  -  9
    3  -  8 
    4  -  7
    5  -  6
    6  -  5
    7  -  4
    8  -  3
    9  -  2
    10 -  1



    پایان قسمت ششم از بخش دوم

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

    بخش دوم - قسمت هفتم


    دستور while :

    این دستور یه چیزی بین IF-Then و For عمل میکنه
    که ما یک شرط تعریف میکنیم که نسبت به اون حلقه تکرار بشه , فرمت و مثال :

    while test command
    do
    other commands
    done
    
    
$ cat test10
#!/bin/bash
    var1=10
    while [ $var1 -gt 0 ]
    do
    echo $var1
    var1=$[ $var1 - 1 ]
    done
    
    
$ ./test10
10
9
8
7
6
5
4
3
2
1


    همونطور که میبینید گفته شده تا زمانی که شرط چیزی که ما میخوایم نشده (مقدار متغیر بیشتر از صفره) حلقه ادامه پیدا کنه (چاپ مقدار و کم کردن از متغیر)
    شما میتونید از چند دستور برای این کار استفاده کنید ولی فقط کد وضعیت اجرای اخرین دستور ، شرط محسوب میشه

$ cat test11
#!/bin/bash
# teste chand dastoor dar halghe

    var1=10
    while echo $var1
    [ $var1 -ge 0 ]
    do
    echo "daroone halghe hastim"
    var1=$[ $var1 - 1 ]
    done
    
    
    $ ./test11
    10
    daroone halghe hastim
    9
    daroone halghe hastim
    8
    daroone halghe hastim
    7
    daroone halghe hastim
    6
    daroone halghe hastim
    5
    daroone halghe hastim
    4
    daroone halghe hastim
    3
    daroone halghe hastim
    2
    daroone halghe hastim
    1
    daroone halghe hastim
    0
    daroone halghe hastim
    —1


    دستور Until :

    این دستور کاملا برعکس دستور قبل کار میکنه , فرمت و مثال :

    until test commands
    do
    other commands
    done
    
    
$ cat test12
#!/bin/bash
#
    var1=100
    until [ $var1 -eq 0 ]
    do
    echo $var1
    var1=$[ $var1 - 25 ]
    done
    
    
$ ./test12
100
75
50
25
    $


    یک مثال پویا تر با روش بیش از یک دستور :

$ cat test13
#!/bin/bash
#
    var1=100
    until echo $var1
    [ $var1 -eq 0 ]
    do
    echo "hanooz daroone halgheyim : $var1"
    var1=$[ $var1 - 25 ]
    done
    
    
$ ./test13
100
hanooz daroone halgheyim : 100
75
hanooz daroone halgheyim : 75
50
hanooz daroone halgheyim : 50
25
hanooz daroone halgheyim : 25
0


    استفاده از حلقه ها داخل یکدیگر :

$ cat test14
#!/bin/bash
# estefade az halghe haye dakhele ham
    for (( a = 1; a <= 3; a++ ))
    do
    echo "halghe ye avaliye : $a"
    for (( b = 1; b <= 3; b++ ))
    do
    echo "    halghe ye darooni : $b"
    done
    done
    
      
$ ./test14
halghe ye avaliye : 1
    halghe ye darooni : 1
    halghe ye darooni : 2
    halghe ye darooni : 3
halghe ye avaliye : 2
    halghe ye darooni : 1
    halghe ye darooni : 2
    halghe ye darooni : 3
halghe ye avaliye : 3
    halghe ye darooni : 1
    halghe ye darooni : 2
    halghe ye darooni : 3


    یه مثال دیگه با تنوع نوع حلقه ها :

$ cat test15
#!/bin/bash
#
    var1=5
    while [ $var1 -ge 0 ]
    do
    echo "halghe ye birooni : $var1"
    for (( var2 = 1; $var2 < 3; var2++ ))
    do
    var3=$[ $var1 * $var2 ]
    echo "    halghe ye darooni : $var1 * $var2 = $var3"
    done
    var1=$[ $var1 - 1 ]
    done
    
    
$ ./test15
halghe ye birooni : 5
    halghe ye darooni : 5 * 1 = 5
    halghe ye darooni : 5 * 2 = 10
halghe ye birooni : 4
    halghe ye darooni : 4 * 1 = 4
    halghe ye darooni : 4 * 2 = 8
halghe ye birooni : 3
    halghe ye darooni : 3 * 1 = 3
    halghe ye darooni : 3 * 2 = 6
halghe ye birooni : 2
    halghe ye darooni : 2 * 1 = 2
    halghe ye darooni : 2 * 2 = 4
halghe ye birooni : 1
    halghe ye darooni : 1 * 1 = 1
    halghe ye darooni : 1 * 2 = 2
halghe ye birooni : 0
    halghe ye darooni : 0 * 1 = 0
    halghe ye darooni : 0 * 2 = 0


    به مثال زیر دقت کنید (ترکیب) :

$ cat test16
#!/bin/bash
# tarkibe until va while
#
    var1=3
    until [ $var1 -eq 0 ]
    do
    echo "halghe ye birooni : $var1"
    var2=1
    while [ $var2 -lt 5 ]
    do
    var3=$(echo "scale=4; $var1 / $var2" | bc)
    echo "    halghe ye darooni : $var1 / $var2 = $var3"
    var2=$[ $var2 + 1 ]
    done
    var1=$[ $var1 - 1 ]
    done
    
    
$ ./test16
halghe ye birooni : 3
    halghe ye darooni : 3 / 1 = 3.0000
    halghe ye darooni : 3 / 2 = 1.5000
    halghe ye darooni : 3 / 3 = 1.0000
    halghe ye darooni : 3 / 4 = .7500
halghe ye birooni : 2
    halghe ye darooni : 2 / 1 = 2.0000
    halghe ye darooni : 2 / 2 = 1.0000
    halghe ye darooni : 2 / 3 = .6666
    halghe ye darooni : 2 / 4 = .5000
halghe ye birooni : 1
    halghe ye darooni : 1 / 1 = 1.0000
    halghe ye darooni : 1 / 2 = .5000
    halghe ye darooni : 1 / 3 = .3333
    halghe ye darooni : 1 / 4 = .2500


    همچنین با ترکیب دو روش حلقه های درون هم و تغیر IFS میتونیم داخل فایل ها رو با حلقه ها مرور کنیم

cat test17
#!/bin/bash
# taghire IFS
    IFS.OLD=$IFS
    IFS=$'\n'
    for var1 in $(cat /etc/passwd)
    do
    echo "meghdar : $var1"
    IFS=:
    for var2 in $var1

    do
    echo "    $var2"
    done
    done
    
    
./test17
meghdar : rednaxela:x:501:501:red naxela:/home/rednaxela:/bin/bash 
    rednaxela
    x
    501
    501
    red naxela
    /home/rednaxela
    /bin/bash
meghdar : red:x:502:502:red:/home/red:/bin/bash
    red
    x
    502
    502
    red
    /home/red
    /bin/bash

 

    پایان قسمت هفتم از بخش دوم

به اشتراک گذاری این ارسال


لینک به ارسال
به اشتراک گذاری در سایت های دیگر

برای ارسال دیدگاه یک حساب کاربری ایجاد کنید یا وارد حساب خود شوید

برای اینکه بتوانید دیدگاهی ارسال کنید نیاز دارید که کاربر سایت شوید

ایجاد یک حساب کاربری

برای حساب کاربری جدید در سایت ما ثبت نام کنید. عضویت خیلی ساده است !

ثبت نام یک حساب کاربری جدید

ورود به حساب کاربری

دارای حساب کاربری هستید؟ از اینجا وارد شوید

ورود به حساب کاربری