PDA

View Full Version : برنامه نویسی bash sript در لینوکس



mary008
سه شنبه 28 آبان 1392, 00:43 صبح
با سلام

من در برنامه نویسی بش هیچ تجربه ای ندارم ممنون میشم اگه می تونید راهنماییم کنید :چشمک:

یک برنامه مخوام بنویسم که بتونه از سه دستور input و print و signal استفاده کنه و با این سه دستور کارهای مختلف کنه مثل جمع و تفریق و امثال اینها :افسرده:

RoboC0der
سه شنبه 28 آبان 1392, 01:23 صبح
شما دقیقا" می خواهید چه کاری را انجام بدید ؟
دستوراتی با این عناوین که ذکر کردید در بش وجود نداره و همینطور انجام اعمال محاسباتی در بش هم کار سختی نیست.
مثلا" :
roboc0der@linux-k4ur:~> echo "5 * 5.2" | bc -l
26.0

ahmad24shargh
سه شنبه 28 آبان 1392, 05:53 صبح
با سلام

من در برنامه نویسی بش هیچ تجربه ای ندارم ممنون میشم اگه می تونید راهنماییم کنید :چشمک:

یک برنامه مخوام بنویسم که بتونه از سه دستور input و print و signal استفاده کنه و با این سه دستور کارهای مختلف کنه مثل جمع و تفریق و امثال اینها :افسرده:

دستور ورودی read دستور خروجی echo و printf و البته خروجی به فایل با استفاده از ریدایرکتورها یا خروجی به فرامین دیگه توسط pipe برای ارسال سیگنال kill وبرای دریافت سیگنال trap



echo -e "`date +"%A %d %B %Y %R"`\t FATAL ERROR. aria2c binary file Not Found In `uname -n`" | tee -a logfile 2> /dev/null

دستور بالا خروجی رو همزمان به صفحه نمایش و لاگ فایل با استفاده از echo میفرسته

دستور printf خروجی فرمت بندی شده رو ایجاد میکنه یه جورایی مثل تابع کتابخانه استاندارد C


temp="`date +"%A %d %B %Y %R"`"
let temp_length=${#temp}
printf "%${temp_length}s \t Summary traffic statistics for today :\n" " " | tee -a "$logfile"
...
declare -a traffic
let j=0
for i in $(/usr/bin/vnstat | grep -Ei "today.*|`date +"%D"`" | tr '|' '\n');
do
traffic[$j]="$i"
let j++
done
rx="${traffic[1]} ${traffic[2]}"
tx="${traffic[3]} ${traffic[4]}"
total="${traffic[5]} ${traffic[6]}"
avg_rate="${traffic[7]} ${traffic[8]}"
printf "%${temp_length}s \t %-13s%-13s%-13s%-13s\n" " " "rx" "tx" "total" "avg. rate" | tee -a "$logfile"
printf "%${temp_length}s \t %-13s%-13s%-13s%-13s\n" " " "$rx" "$tx" "$total" "$avg_rate" | tee -a "$logfile"

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


let stop=$((28200-((`date +"%H" | sed 's:\(0*\)\(.*\):\2:g'`*60*60)+(`date +"%M" | sed 's:\(0*\)\(.*\):\2:g'`*60))))

یه متغیر به نام stop تعریف میکنه که تعداد ثانیه های باقیمانده تا ساعت 7:50 دقیقه صبح رو برمیگردونه(مثبت یا منفی) با فرمت (())$ میشه محاسبات ریاضی روی اعداد صحیح رو انجام داد.


$ echo $((5*4-2))

البته روشهای دیگه ای هم هست مثل همین یوتیلیتی bc که دوستمون فرمودند.

mary008
سه شنبه 28 آبان 1392, 09:39 صبح
دستور ورودی read دستور خروجی echo و printf و البته خروجی به فایل با استفاده از ریدایرکتورها یا خروجی به فرامین دیگه توسط pipe برای ارسال سیگنال kill وبرای دریافت سیگنال trap



echo -e "`date +"%A %d %B %Y %R"`\t FATAL ERROR. aria2c binary file Not Found In `uname -n`" | tee -a logfile 2> /dev/null

دستور بالا خروجی رو همزمان به صفحه نمایش و لاگ فایل با استفاده از echo میفرسته

دستور printf خروجی فرمت بندی شده رو ایجاد میکنه یه جورایی مثل تابع کتابخانه استاندارد C


temp="`date +"%A %d %B %Y %R"`"
let temp_length=${#temp}
printf "%${temp_length}s \t Summary traffic statistics for today :\n" " " | tee -a "$logfile"
...
declare -a traffic
let j=0
for i in $(/usr/bin/vnstat | grep -Ei "today.*|`date +"%D"`" | tr '|' '\n');
do
traffic[$j]="$i"
let j++
done
rx="${traffic[1]} ${traffic[2]}"
tx="${traffic[3]} ${traffic[4]}"
total="${traffic[5]} ${traffic[6]}"
avg_rate="${traffic[7]} ${traffic[8]}"
printf "%${temp_length}s \t %-13s%-13s%-13s%-13s\n" " " "rx" "tx" "total" "avg. rate" | tee -a "$logfile"
printf "%${temp_length}s \t %-13s%-13s%-13s%-13s\n" " " "$rx" "$tx" "$total" "$avg_rate" | tee -a "$logfile"

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


let stop=$((28200-((`date +"%H" | sed 's:\(0*\)\(.*\):\2:g'`*60*60)+(`date +"%M" | sed 's:\(0*\)\(.*\):\2:g'`*60))))

یه متغیر به نام stop تعریف میکنه که تعداد ثانیه های باقیمانده تا ساعت 7:50 دقیقه صبح رو برمیگردونه(مثبت یا منفی) با فرمت (())$ میشه محاسبات ریاضی روی اعداد صحیح رو انجام داد.


$ echo $((5*4-2))

البته روشهای دیگه ای هم هست مثل همین یوتیلیتی bc که دوستمون فرمودند.


ممنونم از لطفتون :لبخندساده:

mary008
سه شنبه 28 آبان 1392, 09:43 صبح
شما دقیقا" می خواهید چه کاری را انجام بدید ؟
دستوراتی با این عناوین که ذکر کردید در بش وجود نداره و همینطور انجام اعمال محاسباتی در بش هم کار سختی نیست.
مثلا" :
roboc0der@linux-k4ur:~> echo "5 * 5.2" | bc -l
26.0


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

x= input ()
y=x+3
print (y)
signal
z=(y+3+5)
wait()

ahmad24shargh
چهارشنبه 29 آبان 1392, 15:40 عصر
یرای wait که از همون دستور read بدون آرگومان استفاده کنید.دستور signal برای ارسال وقفه استفاده میشه که تو اسمبلی معنی داره و تو bash معنی نداره یعنی همون دستور echo یا printf خودش وقفه رو صادر میکنه(بافر رو به خروجی استاندارد میفرسته)(بماند که تابع input هم نیاز به وقفه صفحه کلید داره)
همیشه باید مقادیر ثباتها رو تو متغیرهایی داشته باشید و هر تغییری اعمال بشه باید این متغیرها به روز بشن.برای حافظه هم یه آرایه تعریف کنید و متغیر instruction pointer هم که اشاره گر به دستور بعدیه.bash مشابه C از عملگرهای بیتی پشتیبانی میکنه.در هر حال استفاده از یه زبان تفسیری سطح بالا مثل bash برای اینکار عجیبه.
البته من اسمبلی رو چندین سال پیش خوندم و اطلاعاتم ناقصه.

prpe26
پنج شنبه 28 آذر 1392, 21:18 عصر
x= input ()
y=x+3
print (y)
signal
z=(y+3+5)
wait()





چه مثال باحالی! این مثال رو میتونم در بش براتون پیاده کنم (فقط خودتون شاخ و برگش بدید :D ) .



#!/bin/bash
read -p "Enter a number:" $x
export y=x+3
echo $y|bc
sleep 5
export z=y+3+5
sleep 5
echo $z|bc


اینم کد! امتحان کنید ببینید جواب میگیرید یا نه :)

pswin.pooya
پنج شنبه 28 آذر 1392, 22:21 عصر
استاد ازمون خواسته که یک شبیه ساز سیستم عامل بنویسیم و گفتن که با این دستورات باشه که بتونه اعمال جمع و تفریق رو حساب کنه, من خودمم نفهمیدم چی گفت :لبخند: :لبخند:بی سوادی یک جامعه از اساتید اون شروع میشه و از طریق اونها انتشار پیدا میکنه. باید کمپینی تشکیل بشه تا با اینجور موارد برخورد شه و یا حداقل از انتشار این اشتباهات جلوگیری شه.

من به شدت پیشنهاد میکنم اسم استاد و دانشگاهی رو که توش هستید ذکر کنید. تا لا اقل بقیه این آدم ها رو بشناسن. من خودم توی دانشگاه خودمون آدم های بیسواد زیادی رو میشناسم که دارن تدریس میکنن. اینکه چیزی رو بلد نباشی ایراد نداره، اما اگر اون چیز رو بخوای یاد بدی خیانت به مملکت و بقیه بشمار میره. یه استاد داشتم که بهم زنگ زد گفت من نمی تونم setup لینوکس رو پیدا کنم و فردا قرار درسش بدم، می تونی بیای دو ساعته بهم بگیش. فکرش رو کنید طرف حتی نمی دونه که لینوکس سیستم عامل هست و بعدش دکترای کامپیوتر داره. و یا تو یه مورد دیگه استاد نمی دونست که چه شکلی میشه پروژه رو از ویژوال استادیو اجراش کرد. ( دکمه Play یا همون F5 رو منظورمه‌:D)

prpe26
پنج شنبه 28 آذر 1392, 22:47 عصر
با کنکوری که ما داریم، همه تمرکز ها میره روی چند درس که نهایتا ممکنه اصلا در فن یا حرفه نهایی مورد استفاده نباشه! در نتیجه کسی که واقعا اهل فنه ممکنه عقب بمونه، ولی کسی که چند تا کتاب رو حفظ کرده میرسه به جایی که لیاقتش رو نداره.