لطفا وارد شوید یا ثبت‌نام کنید تا به انجمن‌ها دسترسی کامل داشته باشید.



 
امتياز موضوع :
  • 0 رأي - معدل امتيازات : 0
  • 1
  • 2
  • 3
  • 4
  • 5
مشکل در نوشتن یه اسکریپت
2007-09-16, 07:19 PM,
ارسال : #1
مشکل در نوشتن یه اسکریپت
سلام
من تازه اسکریپت نویسی رو شروع کردم لطفا منو توی پیدا کردن اشکال این قطعه کد کمک کنید:
کد :
cu_y=$(date +"%Y");
if [ $s='j']; then
   if [date +"%m"=2 && date +"%d">20 || date +"%m">2 ]; then
      cu_y=$(($cu_y-612));
   else
      cu_y=$(($cu_y-620));
   fi
fi
        
cu_d=$((date +"%j"));

current_value=$(($cu_y*365+$cu_d));
اینم ارورش:
کد :
./your_age.sh: line 27: [: missing `]'
./your_age.sh: line 35: date +"%j": syntax error: operand expected (error token is ""%j"")
./your_age.sh: line 37: 2007*365+: syntax error: operand expected (error token is "+")
./your_age.sh: line 41: =-555675: command not found
./your_age.sh: line 45: /30: syntax error: operand expected (error token is "/30")

./your_age.sh: line 47: (-30*())/30: syntax error: operand expected (error token is "))/30")
نقل قول این ارسال در یک پاسخ
2007-09-16, 07:22 PM,
ارسال : #2
پاسخ: مشکل در نوشتن یه اسکریپت
ضمنا من خیلی کروشه و پرانتر ووو رو تغییر دادم ولی همیشه ارور میگیره دیگه خسته شدم
نقل قول این ارسال در یک پاسخ
2007-09-16, 07:28 PM,
ارسال : #3
پاسخ: مشکل در نوشتن یه اسکریپت
وقتی هم که دور اون قسمتهای condition دستورات پرانتز گذاشتم ارورها کمتر شد ولی هنوز ارور داره:
کد :
./your_age.sh: line 28: syntax error near unexpected token `date'
./your_age.sh: line 28: `   if [(date +"%m")=2 && (date +"%d")>20 || (date +"%m")>2 ]; then'
نقل قول این ارسال در یک پاسخ
2007-09-17, 08:20 AM,
ارسال : #4
پاسخ: مشکل در نوشتن یه اسکریپت
ببینید این همون نتیجه‌ای که میخواید رو میده؟:
کد :
cu_y=$(date +"%Y");
if [   "$s"   =   "j"   ]  ; then
   if [  $(date +%m) -eq 2 -a $(date +%d) > 20 -o $(date +%m) > 2 ] ; then
      cu_y=$(($cu_y-612));
   else
      cu_y=$(($cu_y-620));
   fi
fi      
cu_d=$(date +%j);
current_value=$(($cu_y*365+$cu_d));
به چند شکل دیگه هم میشه نوشت. مثلا:
کد :
cu_y=`date +"%Y"`
if [   "$s"   =   "j"   ]; then
   if [  `date +%m` -eq  2  -a  `date +%d`  >  20  -o  `date +%m`  >  2  ] ; then
      let cu_y=cu_y-612
   else
      let  cu_y=cu_y-620
   fi
fi
cu_d=`date +%j`
let  current_value=cu_y*365+cu_d
به back quote ها دقت کنید که با single quote اشتباه نشه (دکمهٔ back quote زیر Esc هست). توی if دومی برای اطمینان از ترتیب اولویت and و or میشه از پرانتز استفاده کرد:
کد :
if [   \(   `date +%m`  -eq  2  -a  `date +%d`  >  20  \) -o  `date +%m` >  2  ]  ; then
معلومه که قبلا C کار کردید. اما خیلی از syntax ها توی شل فرق داره با C. مثل && و || . قبل از اینکه شروع به اسکریپت‌نویسی کنید بهتره این تفاوت‌ها رو یاد بگیرید تا گیج نشید و از برنامه‌نویسی شل لذت ببرید. مقالات لیست شده در سایت هزاردستان رو خوندید؟
http://wiki.hezardastan.org/ArticleList
موفق باشید Smile

StarCalendar | Blog | 1+ | OS
مشاهده تارنمای کاربر جستجوی تمامی ارسال های کاربر
نقل قول این ارسال در یک پاسخ
2007-09-19, 01:09 AM,
ارسال : #5
پاسخ: مشکل در نوشتن یه اسکریپت
ممنون ilius جان خیلی کمک کردی
البته من میخواستم از روی راهنمای سریع سینتکسش این کار رو بکنم اون && || هم نوشته بود که AND و OR منطقی واسه همین استفاده کردم فکر کنم توی منوال test هم نوشته.

یه سوال اونم اینکه:
من میخوام یه دایروکتوری به اسم .bin توی دایرکتوری خونگیم داشته باشم خوب باید به .bash_profile اضافه بشه من دو شکل رو امتحان کردم:

یک)
PATH=~/.bin:/usr/bin
و....
توی همون فایل
دو)
تغییر اون عبارت شرطی و عوض کردن bin با .bin که چک میکنه ببینه این دایرکتوری هست و اضافه ش میکنه ولی در هر دو صورت وقتی دستور
export $path رو میزنم اون دایرکتوری توش نیست و کلا اسکریپتهای داخل اون دایرکتوری رو اجرا نمیکنه در حالیکه مجوز اجرائي نداره
فایل .bashrc هم خوندم چیزی که به نظرم مربوط باشه پیدا نکردم حتی داکیومنها و مثالهای داخل /ur/share/doc/bash/example رو هم خوندم ولی هیچی................
اینم اون کد:
کد :
# set PATH so it includes user's private bin if it exists
if [ -d ~/.bin ] ; then
    PATH=~/.bin:"${PATH}"
fi
جستجوی تمامی ارسال های کاربر
نقل قول این ارسال در یک پاسخ
2007-09-19, 01:16 AM,
ارسال : #6
پاسخ: مشکل در نوشتن یه اسکریپت
ببخشین پشت سر هم سوال میدم یه سوال دیگه هم دارم در واقع یه نظر مشورتی میخوام اینجور که تا حالا که یه روزی هست با شل اسکریپت کار میکنم دو شکل اصل مقداردهی به متغیر وقتی یه متغیر رو فراخوانی میکنیم داریم:
کد :
val=$(($y*365+($m-1)*30+$d)) ;
یکی هم به این شکل
کد :
let val=$y*365+$(($m-1))*30+$d ;
واسه عبارتهای شرطی هم توی بخش شرطشون باید مثلا یه عبارتی مثل عبارت بالا فرم اولیش باشه توی گیومه
.
.
این درسته؟
اگه اینجوریه خوب یکم شل اسکریپت زبان حرافی به نظر میاد واسه یه مقدار دهی ساده کلی باید پرانتز و... گذاشت به نظر دست و پا گیر میاد شل اسکریپت فقط با این نوع استاندارد شده و انواع دیگه نداره؟ که یه مفسر هوشمندتر داشته باش؟
جستجوی تمامی ارسال های کاربر
نقل قول این ارسال در یک پاسخ
2007-09-19, 04:23 PM,
ارسال : #7
پاسخ: مشکل در نوشتن یه اسکریپت
قابلی نداشت.
اما چرا لوگین نکرده بودید؟!
سوال اولتون رو دقیقا متوجه نشدم. خب وقتی شما اون کد
کد :
if [ -d ~/.bin ] ; then
    PATH=~/.bin:"${PATH}"
fi
رو به فایل
[ltr]~/.bashrc[/ltr]اضافه کنید. بعد هر ترمینال جدیدی که باز کنید، اون دستور رو اجرا می‌کنه و اگه پوشهٔ bin. وجود داشته باشه به PATH اضافه می‌کنه.طبیعتا توی ترمینال‌هایی که قبلش باز کرده بودید تاثیری نمی‌ذاره مگه اینکه اون فایل رو مجوز اجرا بهش بدید و بعد اجراش کنید. ولی راحت‌ترید که ترمینال رو ببندید و دوباره باز کنید. یا اینکه بنویسید bash و اینتر تا یه پوستهٔ جدید شروع به کار کنه و اون فایل bashrc. رو بخونه.

اما سوال دوم . به اون دستور let که توی پست اولم نوشتم دقت نکردید. نیازی به $ نیست. از پرانتز هم فقط برای مشخص کردن ترتیب عملیات استفاده کنید که البته قبلش باید یه بک‌اسلش بذارید.
کد :
let val=y*365+\(m-1\)*30+d
از این روش هم میشه:
کد :
val=$[y*365+(m-1)*30+d]
که فکر کنم از همه راحت‌تره. فقط سه تا کاراکتر بیشتر از مشابهش توی C.
درسته که بعضی کارا توی شل یه خرده سخت‌تر از C یا زبانهای دیگه هست. اما خب شل کاربردش با اون زبانها فرق داره. دلیل نمیشه که شل هوشمند نباشه. من و شما تا به شل کاملا تسلط پیدا نکنیم نمیتونیم دربارهٔ خوب بودن یا نبودن syntax ش نظر بدیم.
مثلا شل چون بیشتر با رشته‌ها سر و کار داره پس رشته‌هایی که فاصله(Space) نداشته باشن رو میشه بدون کوتیشن بکار برد(بر خلاف C). پس باید برای خوندن متغیرها مشخص بشه که اسم متغیر هست نه رشتهٔ ثابت. که شل از $ برای این منظور استفاده می‌کنه.
امیدوارم منظورم رو خوب رسونده باشم!

StarCalendar | Blog | 1+ | OS
مشاهده تارنمای کاربر جستجوی تمامی ارسال های کاربر
نقل قول این ارسال در یک پاسخ
2007-09-20, 06:39 PM,
ارسال : #8
پاسخ: مشکل در نوشتن یه اسکریپت
بازم ممنون که حوصله میکنی و جواب میدی
راجع به لاگین اون موقع نتونستم لاگین کنم یعنی به خاطر مسائل امنیتی Smile نخواستم لاگین کنم (سیستم خودم نبود).....
فکر کنم همه سوالامو جواب دادی ممنون
خوب راجع به let حق با شماست.....
کلا بعد از اینکه مقاله سایت هزاردستان رو که معرفی کرده بودین و یه مقاله از آلن (پنج قسمتی) راجع به خط فرمان لینوکس بود خوندم الان کلا دیدم عوض شد یعنی بهتر معنای اون سینتکس ها رو میفهم
منم آشنائيم با برنامه نویسی و مفاهیمش فقط در حد یه درس سه واحدی بود که پاس کردم که همونجوری که حدس زده بودین سی بود........خیلی خوش گذشت یادش به خیر.
ضمنا اینم میدونم که هر زبانی کاربرد خاص خودشو داره و شل اسکریپت واسه ساختن اپلیکیشن نیست.یا یه نرم افزار ریاضی چون نمیشه مستقیم و راحت با اعداد حقیقی کار کرد.
و دیگه اینکه به نظر میاد شل اسکریپت به خاطر توسعه و اتوماسیون همون شل به وجود آمده.....
بهرحال شل اسکریپت خیلی مفید و کاربردیه به خصوص که وقتی میخوایم با لینوکس کار کنیم و از قدرتش لذت ببریم یکی از همون نقاط قوتش همینه.
ممنون شما با راهنماییاتون خیلی کمک کردین.
جستجوی تمامی ارسال های کاربر
نقل قول این ارسال در یک پاسخ
2007-09-20, 06:46 PM,
ارسال : #9
پاسخ: مشکل در نوشتن یه اسکریپت
اینم برنامه ای که نوشتم.
فقط وقت دیگه حوصله نکردم اون let ها رو درست کنم.
کد :
#!/bin/bash
#this shell script give your age in year/month I'll try to improve it in the future
#currently it just use Grigori/Jalali calander but it isn't optimpized and very exact becouse of
#using integer not real calculation or using more complicated algorithm for converting between
#different calender systems.
#using "date +"%j" " that indicate the j'th day of the year and use it for calculate
#with this aproach I didn't need to usint mounth.
#if part convert jalali date to georgian.
#for more exact resalut i should use 365.25 day per year and 365.25/12 day per month i wanna
#add a [value] math operator to that at the end if you want you can use more complicated
#algorithm.
############
#after some try at late night i can't use real numbers directly in teh shell maybe
#the usnig bc program be helpfull.
echo "========Your Age Script V1.3============";
echo "===  by nimawebgard       Copyright as:GPL ===";
echo "===       Last edition:27-6-1386      ===";
echo "=========================================";
echo -n "what calander system do you use?(jalali/Georgian) just type j/g?>"
read -t 10 s ;
if [ -z "$s"  ];then echo "Sorry! you've been died before you've known your age";exit 0;fi;
echo -n "day >"
read -t 10 d ;
if [ -z "$d"  ];then echo "Sorry! you've been died before you've known your age";exit 0;fi;
echo -n "month number>"
read -t 10 m
if [ -z "$m"  ];then echo "Sorry! you've been died before you've known your age";exit 0;fi;
echo -n "year>"
read -t 10 y
if [ -z "$y"  ];then echo "Sorry! you've been died before you've known your age";exit 0;fi;

echo;echo;echo;
echo "===============Resault===================="
#now obtaining the current_value in day

cu_y=$(date +"%Y");
cu_d=$(date +"%j");

#error detection part:
if [ "$s" != "j" -a "$s" != "g" ]; then
   echo "you give a wrong Calander System";
   exit 0 ;
fi
if [ "$d" -gt 31 -o "$d" -le 0 -o "$m" -le 0 -o "$m" -gt 12 ];then
   echo "Hey! you give wrong date What a hell you're doing??";
   exit 0;
fi
if [ "$y" -gt $(date +"%Y") ];then
   echo "you're havn't born yet" ;
   echo "This script dosn't work with NBYs(Not Born Yet)" ;
   exit 0;
fi

if [ "$s" = "j" ] ;then
   if [ "$y" -lt "$(($cu_y-750))"  ] ; then #cu_y-750 for ex: 2007-620-130=1257
      echo "Owwww Are you a Ghost?"
      echo "go to that hell that you've came"
      exit 0;
   fi
fi
if [ "$s" = "g" ] ;then
   if [ "$y" -lt "$(($cu_y-130))" ] ; then
      echo "Owwww Are you a Ghost?"
      echo "go to that hell that you've came"
      exit 0;
   fi
fi
# end of error detection part.

#convert jalali date to Georgian:

if [   "$s"   =   "j"   ]  ; then
   if [  $(date +"%m") -eq 2 -a $(date +"%d") > 20 -o $(date +"%m") > 2 ] ; then
      y=$(($y+621));
   else
      y=$(($y+622));
   fi
   d=$((($m-1)*30+$d+80)) ; #if it's Jalali
   else
       d=$((($m-1)*30+$d)); #if it's Georgian    
fi  

birth_value=$(($y*365+$d)) #you can use "let birth_value=$y*365+$(($m-1))*30+$d ".
current_value=$(($cu_y*365+$cu_d))

#now obtaining the age value

age_value=$(($current_value-$birth_value)) #you can try this "let A=$B-$C"

#now printing in year mont day format

age_y=$(($age_value/365)) ;
age_m=$((($age_value-365*($age_y))/30)) ;
age_d=$(($age_value-($age_y*365+$age_m*30))) ;
if [ "$(($age_d-4))" -lt 0 ] ;then
   age_m=$(($age_m-1));
   age_d=$(($age_d+30));
fi

echo "$age_y years and $age_m month and $(($age_d-4)) days";
echo "don't be panic this script have a few day's tolerance because of estamination" ;

exit 0
جستجوی تمامی ارسال های کاربر
نقل قول این ارسال در یک پاسخ


رفتن به انجمن :


کاربران در حال مشاهده موضوع : 1 مهمان