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



 
امتياز موضوع :
  • 0 رأي - معدل امتيازات : 0
  • 1
  • 2
  • 3
  • 4
  • 5
مشکل در نوشتن یک شل اسکریپت
2009-02-12, 03:08 PM,
ارسال : #1
مشکل در نوشتن یک شل اسکریپت
سلام

من دارم یک برنامه ساده با شل می نویسم
این برنامه یک یک برنامه ساده بانکی هستش باید این کار ها را بتونه انجام بده
1-باز کردن حساب
2- پرداخت به حساب
3- برداشت از حساب
همه اطلاعات دارندگان حساب را در یک فایل ساده ذخیره میشه
حالا مشکل من اینه که برای پرداخت یا برداشت از حساب نمی دونم چه جوری این کار را انجام بدم:
- چه جوری بعد از پیدا کردن یک شماره حساب با دستور grep مبلغی را اضافه یا کم کنم

کسی از دوستان میدونه چه جوری باید این کار را انجام بدم؟؟

درضمن اطلاعات اینجوری در فایل ذخیره شده اند:

کد :
شماره حساب|اسم دارنده حساب|مبلغ موجود در حساب|اطلاعات تماس
نقل قول این ارسال در یک پاسخ
2009-02-13, 12:30 AM,
ارسال : #2
پاسخ: مشکل در نوشتن یک شل اسکریپت
خب این برای چی با زبان شل هست؟ عجیب بنظر میاد.
تمرین درسیه؟!!


Only God

I Wish I Was Buddha
کاش بودا بودم

Live And Let Live
زندگی کن و بگذار زندگی کنند

Forgive And Be Forgiven
ببخش و بخشیده شو

مشاهده تارنمای کاربر جستجوی تمامی ارسال های کاربر
نقل قول این ارسال در یک پاسخ
2009-02-13, 03:20 AM,
ارسال : #3
پاسخ: مشکل در نوشتن یک شل اسکریپت
نقل قول :کسی از دوستان میدونه چه جوری باید این کار را انجام بدم؟؟
فکر نمیکنم کسی براتون انجام بده... شما خودتون شروع کنید اگر به مشکلی خوردید مطمئن باشید دوستان کمک میکنن

این خرابه قبرستان نه ایران ماست *** این خرابه ایران نیست٬ ایران کجاست؟
جستجوی تمامی ارسال های کاربر
نقل قول این ارسال در یک پاسخ
2009-02-13, 11:13 AM,
ارسال : #4
پاسخ: مشکل در نوشتن یک شل اسکریپت
وقتی با دستور grep مقدار عددی رو گرفتی با دستور let میتونی مقدارشو عوض کنی. فقط نکته اینکه مقدار عددی که از فایل دریافت شده اگه اولش صفر داشت مثل 09 باید صفر اولش رو برداری مثلا تا بشه 9 در غیر اینصورت اگه با دستور let بخوای از دستور let واسه تغییر این مقدار استفاده کنی بهت خطا میده. مثلا با دستور زیر خروجی عددی رو به یک متغیر میریزی:
کد :
x=`echo 9`
بعد با دستور let بهش ۹ تا دیگه اضافه میکنی:
کد :
let "x += 9"
دستور بالا رو میشه به یکی از اشکال زیر هم نوشت:
کد :
let x+=9
(( x += 9 ))
بعدش که مقدار x عوض شد باید دوباره تو فایل نوشته بشه. با دستور sed میشه اینکارو کرد که میتونه با regular expression ها هم کار کنه. دستور sed یک ورودی میگیره، بعد از تجزیه تحلیل خروجی میده.

در هر صورت من هم با جناب Folaani موافقم، اگه واقعا فقط واسه خودتونه که هیچی ولی در غیر اینصورت اگر تعداد رکوردها زیاد باشه و در تعداد زیادی فایل باید جستجو و جایگزینی بشه، در اینصورت Bash واسه اینکار مناسب نیست.

وب‌نوشت رایانه‌دوست؛ جزء کوچکی از اجتماع کاربرهای گنو/لینوکس
مشاهده تارنمای کاربر جستجوی تمامی ارسال های کاربر
نقل قول این ارسال در یک پاسخ
2009-02-13, 06:38 PM,
ارسال : #5
پاسخ: مشکل در نوشتن یک شل اسکریپت
نقل قول :خب این برای چی با زبان شل هست؟ عجیب بنظر میاد.
تمرین درسیه؟!!

آره تمرین درسیه.
نقل قول :فکر نمیکنم کسی براتون انجام بده... شما خودتون شروع کنید اگر به مشکلی خوردید مطمئن باشید دوستان کمک میکنن

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

نقل قول :وقتی با دستور grep مقدار عددی رو گرفتی با دستور let میتونی مقدارشو عوض کنی. فقط نکته اینکه مقدار عددی که از فایل دریافت شده اگه اولش صفر داشت مثل 09 باید صفر اولش رو برداری مثلا تا بشه 9 در غیر اینصورت اگه با دستور let بخوای از دستور let واسه تغییر این مقدار استفاده کنی بهت خطا میده. مثلا با دستور زیر خروجی عددی رو به یک متغیر میریزی:
کد:

x=`echo 9`

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

let "x += 9"

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

let x+=9
(( x += 9 ))

بعدش که مقدار x عوض شد باید دوباره تو فایل نوشته بشه. با دستور sed میشه اینکارو کرد که میتونه با regular expression ها هم کار کنه. دستور sed یک ورودی میگیره، بعد از تجزیه تحلیل خروجی میده.

در هر صورت من هم با جناب Folaani موافقم، اگه واقعا فقط واسه خودتونه که هیچی ولی در غیر اینصورت اگر تعداد رکوردها زیاد باشه و در تعداد زیادی فایل باید جستجو و جایگزینی بشه، در اینصورت Bash واسه اینکار مناسب نیست.

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

کد :
grep "shomare hesab" esmle\file

و همین طور که میدونید وقتی از دستور بالا استفاده میکنید تمام خطی که این شماره حساب درش هست نشان داده میشه
مثل این:
کد :
1002|reza|4000|iran

حالا سوال اینه چه جوری میشه مبلغ موجود را از این خط که توسط grep پیدا شده جدا کرد بعد تغییرات را روی این مبلغ ایجاد کرد و دوباره در این خط و فایل ذخیره کرد.
نقل قول این ارسال در یک پاسخ
2009-02-13, 08:51 PM,
ارسال : #6
پاسخ: مشکل در نوشتن یک شل اسکریپت
نقل قول :آره تمرین درسیه.
نه بابا!
کجا؟
ما که اون قدیما درس میخوندیم خبری از اینطور چیزا نبود.
یعنی میگم توی سیستم آموزشی از این درسا گذاشتن یا مسئله طور دیگری هست؟


Only God

I Wish I Was Buddha
کاش بودا بودم

Live And Let Live
زندگی کن و بگذار زندگی کنند

Forgive And Be Forgiven
ببخش و بخشیده شو

مشاهده تارنمای کاربر جستجوی تمامی ارسال های کاربر
نقل قول این ارسال در یک پاسخ
2009-02-14, 12:49 AM,
ارسال : #7
پاسخ: مشکل در نوشتن یک شل اسکریپت
خب بعد از دستور grep که رکورد مورد نظر رو از فایل استخراج کردیم باید با دستور cut ستون (فیلد) مورد نظر از اون رکورد رو بدست بیاریم، مثلا:
کد :
grep "shomare" filename | cut -d '|' -f 3
که دستور بالا خط مورد نظر رو از فایل میخونه و خروجی رو به ورودی دستور cut میفرسته که دستور cut هم با کاراکتر | خط رو تقسیم بندی میکنه و فیلد یا ستون ۳ رو به خروجی که صفحه نمایش باشه میفرسه. میشه این خروجی رو به یک متغیر ریخت:
کد :
x=$(grep "shomare" filename | cut -d '|' -f 3)
بعدش همونطور که قبلا گفتم میشه مقدار این متغیر رو عوض کرد و با دستوری مثل sed با مقدار قبلی که تو فایل هست جایگزینش کرد.

وب‌نوشت رایانه‌دوست؛ جزء کوچکی از اجتماع کاربرهای گنو/لینوکس
مشاهده تارنمای کاربر جستجوی تمامی ارسال های کاربر
نقل قول این ارسال در یک پاسخ
2009-02-15, 01:10 PM,
ارسال : #8
پاسخ: مشکل در نوشتن یک شل اسکریپت
PC2st.ir واقعا دستتون دردنکنه

من چون با sed زیاد آشنا نیستم نمی دونم دقیقا این عوض کردن جای متغییر را چطور انجام بدم(اگر راهنمایی کنید ممنون میشوم). چون اینجور که پیداست sed تمام مبلغ ها را با مبلغ جدید جایگزین میکند و این چیزی نیست که من میخوام. ولی با راهنمایی که کردید تونستم با یک راه طولانی تر این کار را بکنم.

کد :
echo -n "enter accno: "
read n

amnt=$(grep "$n" bank | cut -d '|' -f 3)
echo -n "amount to be added:"
read dp
accn=$(grep "$n" bank | cut -d '|' -f 1)
nam=$(grep "$n" bank | cut -d '|' -f 2)
conn=$(grep "$n" bank | cut -d '|' -f 4)
let "$amnt+=$dp"
sed "/${accn}/d" bank | cat > bank
echo "$accn|$nam|$amnt|$conn" | cat >> bank

یک سوال دیگه sed اصل فایل را نباید تغییر بدهد؟؟ وقتی می خواهم با این دستور یک خط از فایل را پاک کنم فقط بصورت مجازی پاک میکنه و در اصل فایل تغییری نمیدهد. من هم مجور شد خروجی را به cat بدم.
نقل قول این ارسال در یک پاسخ
2009-02-18, 12:10 AM,
ارسال : #9
پاسخ: مشکل در نوشتن یک شل اسکریپت
عذر میخوام که دیر جواب میدم (باید پروژه‌ام رو به استاد تحویل میدادم).

اصولا تا جایی که میدونم تو لینوکس نمیشه یک فایل رو هم برای ورودی هم برای خروجی استفاده کرد، مثلا دستور زیر اشتباهه:
کد :
cat filename > filename
که البته دستور cat یک متن خطا هم چاپ میکنه ولی بعضی دستورات مثل sed بدون اعلان قبلی محتویات فایل رو پاک میکنه!

پس اینکه نمیشه خروجی ناشی از یک فایل ورودی رو به خود فایل ریخت، مختص به sed نیست و برای همه دستورات همینجوره. به همین خاطر خروجی دستور رو باید به یک فایل دیگه‌ای ریخت (یا یک متغیر) و بعد از فایل جدید استفاده کرد. راستش کدهایی که نوشته بودی رو متوجه نشدم که دقیقا چیکار میکنه، من واسه جایگزینی یک مقدار توی یک فایل از دستور زیر استفاده میکنم:
کد :
sed "s/^old/new/" old-file > new-file
دستور بالا خطوطی که اولش با old شروع شده، بجای old متن new رو میگذاره. بعدا همین فایل جدید رو میشه رو فایل قبلی move کرد.
البته فکر کنم دیگه نیازی به این توضیحات من نداشتی Smile

وب‌نوشت رایانه‌دوست؛ جزء کوچکی از اجتماع کاربرهای گنو/لینوکس
مشاهده تارنمای کاربر جستجوی تمامی ارسال های کاربر
نقل قول این ارسال در یک پاسخ
2009-02-18, 09:02 AM,
ارسال : #10
پاسخ: مشکل در نوشتن یک شل اسکریپت
نقل قول :عذر میخوام که دیر جواب میدم (باید پروژه‌ام رو به استاد تحویل میدادم).

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

cat filename > filename

که البته دستور cat یک متن خطا هم چاپ میکنه ولی بعضی دستورات مثل sed بدون اعلان قبلی محتویات فایل رو پاک میکنه!

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

sed "s/^old/new/" old-file > new-file

دستور بالا خطوطی که اولش با old شروع شده، بجای old متن new رو میگذاره. بعدا همین فایل جدید رو میشه رو فایل قبلی move کرد.
البته فکر کنم دیگه نیازی به این توضیحات من نداشتی Smile
sed دارای آپشن -i (مخفف in-place) است که عملیات داده شده رو به طور مستقیم و یا در جا رو فایل اعمال می کنه. البته معقول تر اینه که ابتدا از صحت نتیجه مطمئن شیم، یعنی توی خروجی استاندارد یا یک فایل، خروجی sed رو ببینیم. به این آپشن میشه یک پسوند هم به عنوان آرگومان داد که از فایل قبل از اعمال تغییرات بکاپ بگیره.
جستجوی تمامی ارسال های کاربر
نقل قول این ارسال در یک پاسخ
2009-02-18, 03:41 PM,
ارسال : #11
پاسخ: مشکل در نوشتن یک شل اسکریپت
بسیار ممنون Smile نکته به جایی بود.

وب‌نوشت رایانه‌دوست؛ جزء کوچکی از اجتماع کاربرهای گنو/لینوکس
مشاهده تارنمای کاربر جستجوی تمامی ارسال های کاربر
نقل قول این ارسال در یک پاسخ


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


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