انجمن‌های فارسی اوبونتو

کمک و پشتیبانی => راهنماها، نکات و ترفندها => نویسنده: nomina775 در 11 آذر 1394، 01:28 ب‌ظ

عنوان: یک محاسبه کوچک در بش
ارسال شده توسط: nomina775 در 11 آذر 1394، 01:28 ب‌ظ
درود
بچه ها میخواستم ببینم کسی کمک میکنه تا یک اسکریپت بنویسم تا کار زیر رو برایم انجام بده
وقتی این اسکریپت اجرا میشه میخوام که اول یه ورودی عدد صحیح بگیره.
بعد که ورودی رو گرفت اون رو به علاوه 1 کنه
بعد حاصل را تقسیم بر 2 کنه
حالا با if اگر حاصل عدد مثبت و صحیح بود اون رو چاپ کنه و بره سراغ خط بعدی اسکریپت که اونم یه چیزی شبیه به همین عملیات شرطی هست.
اگه هم اعشاری شد هیچ کاری نکنه و بره سراغ خط بعدی اسکریپت
تنها مشکلی که دارم اینه که نمیتونم به if بفهمونم که اگه عدد اعشاری بود چاپش نکند.
در ضمن نمیدونم چرا خروجیها هم همه صحیح هستند. مثلا خروجی زیر عدد صحیح هست (هر جفتش)
echo "`expr 5 / 2 `"
echo "5 / 2" | bc
ممنون
عنوان: پاسخ : یک محاسبه کوچک در بش
ارسال شده توسط: احسان فعالپور در 11 آذر 1394، 02:16 ب‌ظ
سلام. میتونی سوئیچ l- رو برای bc استفاده کنی تا نتایج دیگه integer نباشن یا از این روش استفاده کنی:
ehsan@ehsan-SVF152190X:~$ echo "scale=5; 5/2" | bc
2.50000
برای چک کردن اینکه آیا عدد اعشار داره یا نه هم مطمئن نیستم ولی شاید بتونی با sed یا حتی اپراتورهایی که برای string ها تو بش تعریف شده چک کنی ببینی توی اون متغیر . وجود داره یا نه که کار ساده ایه:
ehsan@ehsan-SVF152190X:~$ x=2.65
ehsan@ehsan-SVF152190X:~$ y=3
ehsan@ehsan-SVF152190X:~$ x_test=$(echo ${x##*\.})
ehsan@ehsan-SVF152190X:~$ echo $x_test
65
ehsan@ehsan-SVF152190X:~$ y_test=$(echo ${y##*\.})
ehsan@ehsan-SVF152190X:~$ echo $y_test
3
ehsan@ehsan-SVF152190X:~$
حالا فقط کافیه چک کنی ببینی متغیرهای تست با متغیراهای متناظرشون برابرن یا نه.
امیدوارم مطلبو گرفته باشی.
عنوان: پاسخ : یک محاسبه کوچک در بش
ارسال شده توسط: nomina775 در 11 آذر 1394، 02:26 ب‌ظ
ممنون احسان جان
یه سوال دیگه هم برام پیش اومد که کم و بیش و مربوط به همین موضوعی که باهاش درگیر هستم میشه.
چطور یک شرط تعریف کنم که اگه متغیرمون عدد زوج بود اجرا بشه و در طرف دیگه یک شرط دیگه تعریف کنم که در صورتی که متغیرش فرد بود دستورش رو اجرا کنه؟
if [$x = odd]
then 

elif [$x = even]
then

fi

به جای [$x = odd] و [$x = even] چی باید بنویسم؟
عنوان: پاسخ : یک محاسبه کوچک در بش
ارسال شده توسط: احسان فعالپور در 11 آذر 1394، 02:30 ب‌ظ
خب این که دیگه خیلی سادس:

ehsan@ehsan-SVF152190X:~$ y=5
ehsan@ehsan-SVF152190X:~$ x=6
ehsan@ehsan-SVF152190X:~$ echo $((y%2))
1
ehsan@ehsan-SVF152190X:~$ echo $((x%2))
0
ehsan@ehsan-SVF152190X:~$

مثلا اینجوری:
ehsan@ehsan-SVF152190X:~$ x=42
ehsan@ehsan-SVF152190X:~$ if [ $(echo $((x%2))) -eq 0 ];then echo "$x is Even."; else echo " $x is Odd.";fi
42 is Even.
ehsan@ehsan-SVF152190X:~$
عنوان: پاسخ : یک محاسبه کوچک در بش
ارسال شده توسط: nomina775 در 11 آذر 1394، 02:33 ب‌ظ
خیلی لطف کردید احسان جان. =D> =D>
برم ببینم میتونم این چیزی که توی ذهنم هست رو پیاده کنم یا نه
 ):P
عنوان: پاسخ : یک محاسبه کوچک در بش
ارسال شده توسط: nomina775 در 11 آذر 1394، 04:24 ب‌ظ
از اونجایی که مشکلم کاملا حل شد (تشکر از آقا احسان) اطلاعاتی که به دست آوردم رو اینجا میگذارم شاید به درد کسی بخورد.
اول از همه توضیح بدم که من میخواستم یک مجموعه کتابی رو مطالعه کنم. این مجموعه شامل ۶ کتاب میشد که هر کدام ۳۰ تا درس داشت.
برنامه م رو اینجور ریخته بودم که روز اول درس یک از کتاب یک رو شروع کنم و با فاصله ۹ روزه اون درس رو مرور کنم.
روزهای فرد رو برای مطالعه درس و روزهای زوج رو برای مرور در نظر گرفته بودم. اینجا بهش میگم که در چه روزی هستم و اون برام محاسبه میکنه که چی رو باید بخونم.

# !/bin/bash
FGRED=`echo "\033[31m"`
FGCYAN=`echo "\033[36m"`
BGRED=`echo "\033[41m"`
FGBLUE=`echo "\033[35m"`
NORMAL=`echo "\033[m"`
echo "Which Day are You in?"
read number
echo "I've Got It"
echo "You are on the Day N.O $number"
echo "You Should"
if [ $(($number % 2)) -eq 0 ]
then
if [ $number -gt 369 ]
then
echo -e "${FGRED}Well Done!${NORMAL}"
elif [ $number -gt 309 ]
then
e=`expr $number - 308 `
echo -e "${FGRED}Review${NORMAL} Lesson: ${FGRED}`expr $e / 2`${NORMAL} From Book ${FGRED}Six${NORMAL}"
elif [ $number -gt 249 ]
then
e=`expr $number - 248 `
echo -e "${FGRED}Review${NORMAL} Lesson: ${FGRED}`expr $e / 2`${NORMAL} From Book ${FGRED}Five${NORMAL}"
elif [ $number -gt 189 ]
then
e=`expr $number - 188 `
echo -e "${FGRED}Review${NORMAL} Lesson: ${FGRED}`expr $e / 2`${NORMAL} From Book ${FGRED}Four${NORMAL}"
elif [ $number -gt 129 ]
then
e=`expr $number - 128 `
echo -e "${FGRED}Review${NORMAL} Lesson: ${FGRED}`expr $e / 2`${NORMAL} From Book ${FGRED}Three${NORMAL}"
elif [ $number -gt 69 ]
then
e=`expr $number - 68 `
echo -e "${FGRED}Review${NORMAL} Lesson: ${FGRED}`expr $e / 2`${NORMAL} From Book ${FGRED}Two${NORMAL}"
elif [ $number -gt 9 ]
then
e=`expr $number - 8 `
echo -e "${FGRED}Review${NORMAL} Lesson: ${FGRED}`expr $e / 2`${NORMAL} From Book ${FGRED}One${NORMAL}"
else
echo -e "${FGRED}Today You Have Nothing to Do! Go and Have Fun!${NORMAL}"
fi
fi
if [ $(($number % 2)) -eq 1 ]
then
if [ $number -gt 360 ]
then
echo -e "${FGRED}Well Done!${NORMAL}"
elif [ $number -gt 300 ]
then
e=`expr $number - 299 `
echo -e "${FGRED}Read${NORMAL} Lesson: ${FGRED}`expr $e / 2`${NORMAL} From Book ${FGRED}Six${NORMAL}"
elif [ $number -gt 240 ]
then
e=`expr $number - 239 `
echo -e "${FGRED}Read${NORMAL} Lesson: ${FGRED}`expr $e / 2`${NORMAL} From Book ${FGRED}Five${NORMAL}"
elif [ $number -gt 180 ]
then
e=`expr $number - 179 `
echo -e "${FGRED}Read${NORMAL} Lesson: ${FGRED}`expr $e / 2`${NORMAL} From Book ${FGRED}Four${NORMAL}"
elif [ $number -gt 120 ]
then
e=`expr $number - 119 `
echo -e "${FGRED}Read${NORMAL} Lesson: ${FGRED}`expr $e / 2`${NORMAL} From Book ${FGRED}Three${NORMAL}"
elif [ $number -gt 60 ]
then
e=`expr $number - 59 `
echo -e "${FGRED}Read${NORMAL} Lesson: ${FGRED}`expr $e / 2`${NORMAL} From Book ${FGRED}Two${NORMAL}"
elif [ $number -gt 0 ]
then
e=`expr $number + 1 `
echo -e "${FGRED}Read${NORMAL} Lesson: ${FGRED}`expr $e / 2`${NORMAL} From Book ${FGRED}One${NORMAL}"
else
echo -e "${FGRED}Today You Have Nothing to Do! Go and Have Fun!${NORMAL}"
fi
fi
exit 0
یه نکته ای هم اینجا هست. از آنجایی که بین خوندن و مرور درس ۹ روز باید فاصله میبود در نتیجه روزهای زوج اولیه رو بیکار هستم و اسکریپت هم همین رو بر میگردونه.

در ضمن میدونم اصلا تیکه کد قشنگی نیست ولی خب از کسی که تا حالا کد نزده انتظار بیشتری هم نمیره  ;D
و میدونم که راههای راحتتری بدون دخالت اسکریپت برای این کار وجود داره ولی خب هرکی یه جوری میپسنده دیگه  :P