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

لطفاً به انجمن‌ها وارد شده و یا جهت ورود ثبت‌نام نمائید

لطفاً جهت ورود نام کاربری و رمز عبورتان را وارد نمائید


توزیع گنو/لینوکس اوبونتو ۲۰ ساله شد 🎉

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

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

آفلاین سعید رسولی

  • ilius, saeedgnu
  • عضو کاربران ایرانی اوبونتو
  • *
  • ارسال: 1543
  • جنسیت : پسر
پاسخ به: شروع برنامه نویسی در لینوکس
« پاسخ #15 : 31 امرداد 1388، 08:41 ق‌ظ »
اول از آقای سجادی تشکر می‌کنم

اما نکتهٔ دیگه‌ای که می‌تونم اضافه کنم اینکه سینگل‌کوت یا دبل‌کوت در دستور echo هم ممکنه تاثیر بذاره، به شرطی که دو تا (یا بیشتر) علامت فاصله پشت سر هم قرار بگیرن.
مثلاً توی این مثالی که آقای سجادی نوشتن:
myvar="Hi there"
echo $myvar
echo "$myvar"
خروجی دو تا echo با هم فرقی نداره، چون در حالت اول، دو کلمهٔ Hi و there بعنوان دو تا آرگومان دستور echo محسوب میشن و دستور echo هم تمام آرگومان‌هاش رو با یه فاصله بین‌شون چاپ میکنه. در حالت دوم فقط یه آرگومان به دستور echo داده میشه که حاوی کل رشتهٔ Hi there هست. البته در اینجا تفاوتی در خروجی وجود نداره، چون بین دو کلمه فقط یه فاصله وجود داره. اما این چطور:
myvar="Hi      there"
echo $myvar
echo "$myvar"
طبق توضیحاتی که دادم میشه پیش‌بینی کرد که echo اولی بیط یه فاصله بین دو کلمه چاپ میکنه(چون بین دو تا آرگومان، هر چند تا فاصله هم بذارید فرقی نمیکنه) اما echo دومی چند تا فاصله بین دو کلمه چاپ میکنه(در واقع عین رشتهٔ myvar$ رو چاپ میکنه.

نکتهٔ دیگه اینکه، کاراکترهای خاص در شل، یه اولویتی نسبت به هم دارن. مثلاً اولویت بک‌اسلش از سینگل‌کوت و دبل‌کوت بیشتره. یعنی توی یه رشتهٔ محصور به دبل‌کوت ی حتی سینگل‌کوت، بازم بک‌اسلش کاراکتر خاص محسوب میشه. اما توی یه رشتهٔ محصور به سینگل‌کوت، دیگه کارکاکتر دالرساین($) کارکاکتر خاص نیست(به همین دلیل مقادیر متغیرها رو جایگزین نمیکنه) پس اولیوت دالرسان از سینگل‌کوت کمتره. در واقع بک‌اسلش اولیوت اول رو داره. بعدش سینگل‌کوت هست. بعدش کارکاکترهای دیگه‌ای مثل دالرساین و براکت‌ها و کروشه‌ها []{} و غیره هستن. و تقریباً آخر از همه دبل‌کوت هست(البته اینو مطمئن نیستم). در واقع وجود دبل‌کوت فقط کاراکتر فاصله رو خنثی می‌کنه(یعنی از یه کارکاکتر خاص تبدیل به یه کاراکتر معمولی در یک رشته میکنه، یعنی کاراکتری با کد 32 و نه چیز دیگه). البته از اونجایی که بک‌اسلش بیشترین اولیوت رو داره، این کارو با بک‌اسلش هم میشه انجام داد. مثلاً شما میخواید یه فایلی که داخل اسمش فاصله هست رو توی خط فرمان استفاده کنید(مثلاً به دستور ls یا chmod یا غیره بدید). چند تا کار می‌تونید انجام بدید:

یکی اینکه اسم فایل رو داخل سینگل‌کوت بذارید. اینطور خیالتون تقریباً راحت هست، فقط نباید کاراکتر سینکل‌کوت داخل اسمش باشه، اگه بود قبل سینگل‌کوت، یه بک‌اسلش بذارید. مثلاً:
touch 'my file'
touch 'ilius\'s file'
اما این دستور اشکال داره:
touch 'ilius's file'در واقع با زدن اینتر، شل منتظر می‌مونه(با چاپ یه کاراکتر < منتظره تا بلوک تموم بشه) چون شما یه سینگل‌کوت باز کردید(آخرین کاراکتر دستور) که هنوز نبستید!


(می‌دونید چرا دستور touch رو انتخاب کردم؟ چون اگه چند تا آرگومان بهش بدید، چند تا فایل میسازه. البته در صورت عدم وجود. اما اگه یه أرگومان بدید، یه فایل میسازه. مثل echo نیست که در بعضی موارد بی‌تفاوت باشه)


اما راه دوم اینکه اسم فایل رو داخل دبل‌کوت بذارید، اما این‌بار باید حواستون به کارکاکترهای $ و {}[] و غیره هم باشه(پس همون سینگل‌کوت بهتره)

راه سوم اینکه اسم فایل رو نه داخل سینگل‌کوت بذارید نه دبل‌کوت! عوضش در جاهایی که لازم هست از کاراکتر بک‌اسلش استفاده کنید:
touch my\ file
touch kill\ micro\$oft\'s\ office
به تک‌تک کاراکترها(مخصوصاً $ و \ و ' و فاصله) دقت کنید. حالا خودتون می‌تونید بک‌اسلش‌ها رو دونه‌دونه حذف کنید و نتیجه رو ببینید(اسم فایل‌هایی که میسازه) تا متوجه تاثیر بک‌اسلش بشید.
« آخرین ویرایش: 31 امرداد 1388، 08:44 ق‌ظ توسط ilius »

آفلاین سید محمود رضا سجادی

  • Hero Member
  • *
  • ارسال: 704
  • جنسیت : پسر
    • مرکز برنامه نویسی ایران
پاسخ به: شروع برنامه نویسی در لینوکس
« پاسخ #16 : 31 امرداد 1388، 01:37 ب‌ظ »
با تشکر از arastoo.s عزیز - آره کمک لازم دارم اما میدونی چرا pdf نکردم؟
چون قصد ادرم خودمم یاد بگیرم (نه اینکه فقط یاد بدم) چون خودمم مبتدیم

به عنوان مثال باید از دوسا عزیزمون ilius جان تشکر کنم که منو شرمنده کردند
منظور من از پست زدن همینه که دوستان سر بزنند و اشکالات منو بگیرند تا ۱-من یه چیزی یاد بگیرم و شاید بعضی دوستان هم به نکانت جدیدی دست پیدا کنند ۲-یه مجموعه کامل آموزشی درست شه

دوست عزیز ilius جان - شما تاج سر مایی همون محمود بگی کافیه
مرکز برنامه نویسی ایران
محلی برای تمامی علاقه مندان به برنامه نویسی http://www.SourceCenter.IR

آفلاین سید محمود رضا سجادی

  • Hero Member
  • *
  • ارسال: 704
  • جنسیت : پسر
    • مرکز برنامه نویسی ایران
پاسخ به: شروع برنامه نویسی در لینوکس
« پاسخ #17 : 31 امرداد 1388، 01:58 ب‌ظ »
این همون قولیه که در باره متغیر های محلی و پترامتری داده بودم
که چون ترجمش در بعضی جاها خیلی سخت و یا غیر ممکن بود اصل متن رو براتون گذاشتم و اگه براتون نا مفهوم میاد فکر کنم با مثالایی که بعدش میزنم بحث روشن بشه
Environment Variable | Description
_____________________________________________________________________________________________
$HOME | The home directory of the current user.
$PATH | A colon-separated list of directories to search for commands.
$PS1 | A command prompt, frequently $, but in bash you can use some
more complex values; for example, the string [\u@\h \W]$ is a
popular default that tells you the user, machine name, and current
directory, as well as giving a $ prompt.
$PS2 | A secondary prompt, used when prompting for additional input;
usually >.
$IFS | An input field separator; a list of characters that are used to sepa-
rate words when the shell is reading input, usually space, tab, and
newline characters.
$0 | The name of the shell script.
$# | The number of parameters passed.
$$ | The process ID of the shell script, often used inside a script for
generating unique temporary filenames; for example /tmp/tmp-
file_$$.

Parameter Variable | Description
__________________________________________________________________________________________________________
$1, $2, ... | The parameters given to the script.
$* | A list of all the parameters, in a single variable, separated by the first
| character in the environment variable IFS.
$@ | A subtle variation on $*; it doesn’t use the IFS environment variable,
| so parameters may be run together if IFS is empty.
« آخرین ویرایش: 31 امرداد 1388، 02:03 ب‌ظ توسط سید محمود رضا سجادی »
مرکز برنامه نویسی ایران
محلی برای تمامی علاقه مندان به برنامه نویسی http://www.SourceCenter.IR

آفلاین سعید رسولی

  • ilius, saeedgnu
  • عضو کاربران ایرانی اوبونتو
  • *
  • ارسال: 1543
  • جنسیت : پسر
پاسخ به: شروع برنامه نویسی در لینوکس
« پاسخ #18 : 31 امرداد 1388، 04:17 ب‌ظ »
خب باز نکته‌ای که به ذهنم رسید دربارهٔ کاربرد متغیر محیطی IFS در حلقهٔ for
این چند خط رو اجرا کنید:
for DIR in $PATH ; do
  echo $DIR
done
حالا یه بار دیگه، اما این دفعه اولش مقدار IFS رو برابر دونقطه می‌ذاریم:

IFS=:
for DIR in $PATH ; do
  echo $DIR
done
تفاوت رو دیدید؟ علتش اینه که توی متغیر محیطی PATH$ مسیر دایرکتوری‌ها با کاراکتر : از هم جدا شده. و مقدار متغیر محیطی IFS بطور پیش‌فرض یه فاصله هست، پس در حالت اول توی حلقهٔ for اون رشته رو فرض میکنه که قسمتهای مختلفش(که توی حلقه استفاده میشه) با یه فاصله از هم جدا شدن. ولی احتمالاً توی مقدار متغیر PATH اصلاً کاراکتر فاصله وجود نداره(مسیر دایرکتوری‌ها با : جدا شده و خود مسیر دایرکتوری‌ها هم احتمالا فاصله نداره) پس در حالت اول حلقه یک‌بار اجرا میشه و کل متغیر PATH رو یکدفعه چاپ میکنه.

اما در حالت دوم(که اولش IFS رو برابر دونقطه میذاریم) رشتهٔ اون متغیر PATH رو با کارکاکتر دونقطه جدا می‌کنه و هر بار داخل متغیر DIR قرار میده و حلقه اجرا میشه. نتیجه اینکه تمام دایرکتوری‌ها متغیر PATH هر کدوم توی یه خط چاپ میشن.

آفلاین OpenS

  • Full Member
  • *
  • ارسال: 213
پاسخ به: شروع برنامه نویسی در لینوکس
« پاسخ #19 : 31 امرداد 1388، 04:22 ب‌ظ »
سلام دوستان

ممنون کارتون عالیه ادامه بدین ;)

آفلاین Freeman

  • High Hero Member
  • *
  • ارسال: 2310
    • KDE Software Compilation
پاسخ به: شروع برنامه نویسی در لینوکس
« پاسخ #20 : 31 امرداد 1388، 09:25 ب‌ظ »
باز هم تشکر از دوستان و خسته نباشید

پیشنهاد میکنم تاپیک مهم بشه

موفق باشید

آفلاین سید محمود رضا سجادی

  • Hero Member
  • *
  • ارسال: 704
  • جنسیت : پسر
    • مرکز برنامه نویسی ایران
پاسخ به: شروع برنامه نویسی در لینوکس
« پاسخ #21 : 01 شهریور 1388، 01:12 ق‌ظ »
خوب دوستان
همونجوری که دیدید ilius جان بحث جالبی رو مطرح کردند که خیلی جالب بود (واقعا لذت بردم)
در ادامه بحث (و منتظر ماندن برای نکته های جالب تر از طرف ایشون و سایر دوستان) بحث رو به سمت یک مثال از متغیر های پارامتری هدایت میکنم

این متغیر ها - متغیرهایی هستند که به عنوان آرگومان به فایل یا بهتر بگم اسکریپت شما داده میشن
لذا برای تست کردن این متغیر ها و امتحان اونها حتما باید اسکریپت بنویسید و نمیشه اونها رو در خود شل مستقیما تایپ کرد(البته بسته به مثال هم هست ;)) اولین مثال برای تفاوت $@ و $* هستش که در همون ترمینال تایپ کنید و دومی یک اسکریپت

IFS=''
set foo bat bam
echo "$@"

echo "$*"
حالا مقدار IFS رو از بین میبریم و دوباره تست میکنیم
unset IFS
echo "$*"

در اینجا باید با توجه به فرمایشات ilius جان به نقش نقل قول دوتایی و تفاوت بین $* و $@ توجه کنید

حالا برای مثال دوم اسکریپت زیر رو بسازید
#!/bin/sh
salutation="Hello"
echo $salutation
echo "the program $0 is now running"
echo "The second parameter is $2"
echo "The first parameter is $1"
echo "The parameter list is $*"
echo "The user's home directory is $HOME"

echo "Please enter the new greeting"
read salutation

echo $salutation
echo "The script is now complited"
exit 0

حالا فرض کنید که این اسکریپت رو شما با یک اسمی در یک داریکتوری سیو کردید
با فرض اینکه نام فایل شما myfile باشه و هم اکنون با محیط متنی (ترمینال) با دایرکتوری مورد نظر cd کرده باشید دستور زیر رو اجرا کنید
./myfile foo bar bazبه خروجی دقت کنید!!!!
اگر نام فایل شما تغییر کنه کجای خروجی تغییر میکنه؟
شما میتونید نام فایل اسکریپت رو در یک متغیر داشته باشید.نام اون متغیر چیه؟
در حین اجرا از شما یک مقدار گرفته میشه(read) فقط قصد من این بود که مطالب پست های قبلی رو تکرار کنیم تا یادمون نره (استفاده از متغیر ها و مفهوم اون)

حالا یک سر فصل جدید رو آغاز میکنیم
دستو test یا ]

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

ممکنه استفاده از کاراکتر ] کمی عجیب و نا مانوس باشه اما در داخل کد باعث خوانایی بیشتر کد میشه!!!!

دستور زیر رو لطفا در ترمینال و با دسترسی رووت اجرا کنید
ls -l /usr/bin/[
نکته ای که در اینجا مهمه اینه که همونجوری که متوجه شدید test یک دستوره
بعضی از دوستان که تازه شروع به اسکریپت نویسی کردند به اشتباه اسم اسکریپت خودشون رو test میذارند و مستقیقا در ترمینال تلیپ میکنند test که اجرا بشه
اما در اینجا مشکلی پیش میاد براشون که نمیدونن کدوم test داره اجرا میشه
اگر در $PATH شما مقدار نقطه (. = دات) رو داشته باشد بهتر متوجه این مشکل میشید و در غیر این صورت حتما اونی اجرا میشه که مد نظر شما نیشت
برای اطمینان از اجرای صحیح فایل مورد نظر در این مورد باید عبارت زی رو تایپ کنید (با آدرس مطلق یا نسبی)
./test
به عنوان ادامه بحث فرض بر این است که وجود یا عدم وجود یک فایل خاص برای اسکریپت شما خیلی مهمه و قصد دارید که وجود این فایل رو چک کنید
باید از دستور test استفاده کنید
test -f <filename>
if test -f fred.c
then
....
fi

این کد با کد زیر برابره

if [ -f fred.c ]
then
....
fi

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

نکته دیگه اینکه اگر دوست دارید که then رو در همون خطی که if قرار داره تایپ بکنید باید با یک ; به سیستم بفهمونید که then جدای از test هستش
if [ -f fred.c ] ; then
....
fi
« آخرین ویرایش: 29 شهریور 1388، 01:56 ق‌ظ توسط سید محمود رضا سجادی »
مرکز برنامه نویسی ایران
محلی برای تمامی علاقه مندان به برنامه نویسی http://www.SourceCenter.IR

آفلاین sahama

  • Hero Member
  • *
  • ارسال: 784
  • جنسیت : پسر
  • الهی به امید تو!
پاسخ به: شروع برنامه نویسی در لینوکس
« پاسخ #22 : 02 شهریور 1388، 03:34 ب‌ظ »
باز هم تشکر از دوستان و خسته نباشید

پیشنهاد میکنم تاپیک مهم بشه

موفق باشید
موافقم
یا علی

lomion

  • مهمان
پاسخ به: شروع برنامه نویسی در لینوکس
« پاسخ #23 : 02 شهریور 1388، 03:39 ب‌ظ »
‫۱) جالبه که این تاپیک خوب از دستم در رفته  :o خدا قوت، دوستان. غنی کردن جامعه اوبونتو یه کار خیلی خوب و مثبت در دنیای گنو هست. بهترین روش یاد گرفتن یاددادنه :)

‫۲) با اینکه مدتی گذشته ولی دیر نشده. تاپیک چسبناک شد. امیدوارم به دل دوستان بچسبه :)

آفلاین سید محمود رضا سجادی

  • Hero Member
  • *
  • ارسال: 704
  • جنسیت : پسر
    • مرکز برنامه نویسی ایران
پاسخ به: شروع برنامه نویسی در لینوکس
« پاسخ #24 : 02 شهریور 1388، 07:43 ب‌ظ »
سلام
تا حالا خیلی چیزا در باره ایکریپت نویسی یاد گرفتیم واز دستور if هم زیاد استفاده کردیم
فکر کنم وقتشه یکم درباره انواع و اقیام مقایسه های منطقی با هم حرف بزنیم

String Comparison | Result
____________________________________________________________________________
string1 = string2 | True if the strings are equal.
string1 != string2 | True if the strings are not equal.
-n string | True if the string is not null.
-z string | True if the string is null (an empty string).

Arithmetic Comparison | Result
_______________________________________________________________________________________
expression1 -eq expression2 | True if the expressions are equal.
expression1 -ne expression2 | True if the expressions are not equal.
expression1 -gt expression2 | True if expression1 is greater than expression2.
expression1 -ge expression2 | True if expression1 is greater than or equal to
| expression2.
expression1 -lt expression2 | True if expression1 is less than expression2.
expression1 -le expression2 | True if expression1 is less than or equal to
| expression2.
! expression | True if the expression is false, and vice versa.

File Conditional | Result
_______________________________________________________________________________________________
-d file | True if the file is a directory.
-e file | True if the file exists. Note that, historically, the -e option has not
| been portable, so -f is usually used.
-f file | True if the file is a regular file.
-g file | True if set-group-id is set on file.
-r file | True if the file is readable.
-s file | True if the file has nonzero size.
-u file | True if set-user-id is set on file.
-w file | True if the file is writable.
-x file | True if the file is executable.

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

حالا یک خاصه در باره if
همونجوری که میدونستید و یا تاحالا از اسکریپت ها حدس زدید if خیلی ساده است و یک تصمیم گیری ساده رو انجام میده
عبارتی رو که بهش بدیم چک میکنه و اگر دستور یا عبارتی که بهش دادیم درست باشه یک کار یا کارهای خاص رو انجام میده و میشه به صورت اختیاری تنظیم کرد که اگر غلط بود هم کارهایی رو انجام بده (یعنی else اختیاریه)
شکل کلی اون اینشکلیه
if condition
then
   statements(TRUE)
else
   statements(FALSE)
fi

حالا یک اسکریپت

#!/bin/sh

echo "Is it morning? Please answer yes or no"
read timeofday

if [ $timeofday = "yes" ]; then
   echo "Good morning"
else
   echo "Good afternoon"
fi

exit 0

حالا یک دستور جدید elif که در واقع همون else if ویا در بعضی زبون های برنامه نویسی elseif هستش

در کد فوق اگر کاربر هر عبارتی غیر از yes با حروف کوچک رو تایپ کنه حتی YES به عنوان no در نظر گرفته میشه که صحیح نیست
پس کد رو در قدم اول به شکل زیر در میارم


#!/bin/sh

echo "Is it morning? Please answer yes or no"
read timeofday

if [ $timeofday = "yes" ]; then
   echo "Good morning"
elif [ $timeofday = no ]; then
   echo "Good afternoon"
else
   echo "Sorry, $timeofday not recogonized. Enetr yes or no"
fi

exit 0

خوب برنامه خیلی بهتر شد اما هنوز مشکل داره.زیرا Yes و No رو تشخیص نمیده و یا yEs و nO رو هم تشخیص نمیده
اما قبل از اینکه به این مشکلات بپردازیم توجه شما رو به یک مشکل بزرگ تر جلب میکنم

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

جواب این سوال :
به پیغام خطایی که به شما داده میشه توجه کنید
[: =: unary operator expected
به نظر شما دلیلش چی میتونه باشه(حدث من اینه که مربوط به متغیر میشه ویا مقداری که داخل اونه چون با تمام مقادیر غیر از اینتر برنامه با موفقیت اجرا میشه)
بیاید مقادیر رو جایگزین متغیر ها کنیم و خط به خط برنامه رو برای خودمون تصور کنیم
دقت کنید که به جای مقدار دادن به متغیر اینتر زدیم پس داخل این متغیر هیچی (حتی null یعنی /0) هم وجود نداره
پس برنامه در قسمت شرط به شکل زیر در میاد
if [ = "yes"]فکر کنم مشکل معلوم شد از کجاست
پس قسمت شرط کد رو به شکل زیر تغییر میدم
if [ "$timeofday" = "yes" ]حالا اگه مقادیر رو جایگزین متغیر ها کنیم مشکلی پیش نمیاد زیرا کد به شکل زیر تبدیل میشه (با اینتر زدن بجای وارد کردن مقدار برای متغیر)
if [ "" = "yes"]خوب پس کد ما در نهایت به شکل زیر در اومد


#!/bin/sh

echo "Is it morning? Please answer yes or no"
read timeofday

if [ "$timeofday" = "yes" ]; then
   echo "Good morning"
elif [ "$timeofday" = no ]; then
   echo "Good afternoon"
else
   echo "Sorry, $timeofday not recogonized. Enetr yes or no"
fi

exit 0
که این کد خیلی امن تره و اطمینان بیشتری بهش میره

در پست های بعد به بررسی for و حلقه ها می پردازیم(مثل while و until) و در بعد از اون با case آشنا خواهیم شد
با این ابزار میشه برنامه رو بهینه کرد تا سوال فوق اینقدر تکرار بشه تا بالا خره کاربر یک مقدار قابل قبول رو وارد کنه و همچنین تمام حالات یک عبارت با حروف بزرگ و کوچیک چک بشه!!! \\:D/
فعلا همه دوستان رو به خدای بزرگ میسپارم
التماس دعا
« آخرین ویرایش: 19 شهریور 1388، 01:24 ب‌ظ توسط سید محمود رضا سجادی »
مرکز برنامه نویسی ایران
محلی برای تمامی علاقه مندان به برنامه نویسی http://www.SourceCenter.IR

آفلاین arastoo.s

  • Jr. Member
  • *
  • ارسال: 70
  • جنسیت : پسر
پاسخ به: شروع برنامه نویسی در لینوکس
« پاسخ #25 : 04 شهریور 1388، 10:35 ق‌ظ »
سلام به دوست عزیز خودم  :)
۲ تا وب برات میزارم شاید به کارت اومد
البته خودت استاد این کاری اما گفتم شاید کمکی کنه
http://www.yolinux.com/
http://linux.org.mt/article/terminal
این کاری که میکنی محشره
به کارت ادامه بده
ما هم چنان منتظریم. =D>
« آخرین ویرایش: 04 شهریور 1388، 10:42 ق‌ظ توسط arastoo.s »
I am bad person , you don't like me , so never  Judge me

آفلاین سید محمود رضا سجادی

  • Hero Member
  • *
  • ارسال: 704
  • جنسیت : پسر
    • مرکز برنامه نویسی ایران
پاسخ به: شروع برنامه نویسی در لینوکس
« پاسخ #26 : 04 شهریور 1388، 03:38 ب‌ظ »
سلام arastoo.s جان
سایت های خیلی جالبی بودند
میشه یه زحمت بکشی لطفا (ویا دیگر دوستان)
من خودم این متنی رو که هر چند روز یکبار مینویسم با ترجمه از چندین سایت و کتاب هست و لذا دیگه وقت و انرژی اونو ندارم که چند تا سایت دیگه رو هم چک کنم
از طرف دیگه سایت هایی که معرفی کردید (مخصوصا دومی)‌به نظرم خیلی جالب وخوب و منظم اومد و حیفم میاد که از دست بدمشون
لذا اگه زحمت بکشید و شما هم پست بزنید (با ترجمه آزاد از این سایت ها که فرمودید و سایت ها و کتاب های دیگه) خیلی عالی میشهو این مجموعه کامل تر میشه
ممنون
مرکز برنامه نویسی ایران
محلی برای تمامی علاقه مندان به برنامه نویسی http://www.SourceCenter.IR

آفلاین mimook

  • Full Member
  • *
  • ارسال: 102
  • جنسیت : پسر
    • mimook
پاسخ به: شروع برنامه نویسی در لینوکس
« پاسخ #27 : 05 شهریور 1388، 12:43 ق‌ظ »
با تشکر از arastoo.s برای معرفی این دو سایت با ارزش
نقل‌قول
http://www.yolinux.com/
http://linux.org.mt/article/terminal
و با کمی تشکر از مترجم گوگل ;) برای ترجمه خنده دارش
و تشکر فراوان از سید محمود رضا سجادی عزیز
 :)

آفلاین firethumbs

  • Full Member
  • *
  • ارسال: 173
پاسخ به: شروع برنامه نویسی در لینوکس
« پاسخ #28 : 06 شهریور 1388، 12:00 ب‌ظ »
افرین
خیلی باحالی  \\:D/

آفلاین سید محمود رضا سجادی

  • Hero Member
  • *
  • ارسال: 704
  • جنسیت : پسر
    • مرکز برنامه نویسی ایران
پاسخ به: شروع برنامه نویسی در لینوکس
« پاسخ #29 : 10 شهریور 1388، 06:38 ب‌ظ »
سلام مجدد
ادامه میدیم البته باید ببخشید که خیلی دیر شد

اگه یادتون باشه تا اونجا اومدیم که elif رو شناختیم و یک اررور در باره استفاده از متغیر ها در if  رو بررسی کردیم

حالا FOR

معمولا وقتی از این استفاده می کنیم که یک متغیر قراره چندین مقدار معلوم و مشخص رو به خودش برای عمل یا اعمالی خاص اختصاص بده
مثلا فرض کنید که یک تابع یا فرمول دارید که قراره برای مقادیری خاص مقدارش محاسبه بشه - اگه این تابع رو F(x) اسم گذاری کنم باید مقادیر F را برای مقادیر مشخصی از x حساب کنیم
در اینجا استفاده از for خیلی مناسبه

شکل کلی این دستور به شکل زیره
for variable in values
do
   statements
done

یک اسکریپت برای تست کردن این دستور
#!/bin/sh

for foo in bar fud 43
do
   echo $foo
done
exit 0

همونجوری که انتظار میره سه عبارت bar - fud - 43 به ترتیب در مونیتور چاپ میشن
حالا یه سوال . برای جواب دادن به سوال زیر باید پستهای قبلی ilius جان رو با دقت مطالعه کنید
سوال : اگر خط for در کد بالا به شکل زیر تغییر کنه چه اتفاقی می افته و چرا؟
for foo in "bar fud 43"
حالا به کد زیر دقت کنید
#!/bin/sh

for file in $(ls f*.sh);do
   lpr $file
done
exit 0

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

نکته : بسط دادن و جایگزینی تنها در زمان اجرا انجام میشه و نه در زمان نوشتن کد و لذا ارورهایی از این قبیل تنها در زمان اجرا معلوم میشن مانند همون اروری که در پست قبلی در باره اون با هم صحبت کردیم

حالا while

واضحه که for بعضی جاها خوبه ولی نه همیشه
اگر یک سری از استرینگ ها رو داشته باشیم که به نوبت جایگزین بشن استفاده از for مناسبه و یا اینکه این عبارات از جایی خونده بشن
اما اگر قرار باشه یک سری عدد رو در یک حلقه قرار بدیم هرگز کد خوبی رو به دست نمیاریم
مثل کد زیر
#!/bin/sh
for foo in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
do
   echo “here we go again”
done
exit 0

راه حا استفاده از while هستش
شکل کلی این دستور
while condition do
  statements
done

وحالا یک برنامه خیلی ضعیف و نا امن برای چک کردن پسورد مینویسیم
#!/bin/sh
echo “Enter password”
read trythis
while [ “$trythis” != “secret” ]; do
  echo “Sorry, try again”
  read trythis
done
exit 0

و حالا یک کد دیگه که خروجیش برای شما تقریبا آشناست (شبیه یکی از کد های گذشته خودمونه)
#!/bin/sh
foo=1
while [ “$foo” -le 20 ]
do
   echo “Here we go again”
   foo=$(($foo+1))
done
exit 0

این کد چیکار میکنه؟
آیا طرز کار اون شبیه کد زیر نیست؟
for foo in 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
برای یاد آوری (-le( چیکار میکرد آیا به معنی کوچیکتر یا مساوی نبود؟

نکته : شل های قدیمی از expr بجای عبارت $(()) استفاده می کنن که البته bash از نوع $(()) پشتیبانی میکنه و ما از این استفاده میکنیم.جالبه بدونیدکه این نوع سرعتره و لذا در سیستم هایی که از این نوع پشتیبانی میکنن بهتره از همین شکل استفاده کنید تا بهره وری سیستم شما افزایش پیدا کنه

دستور بعد یعنی until

until condition
do
   statements
done

وحالا یک کد
#!/bin/sh
until who | grep “$1” > /dev/null
do
   sleep 60
done
# now ring the bell and announce the expected user.
echo -e \\a
echo “**** $1 has just logged in ****”
exit 0

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

دستور جدید و یک دستور زیبا و پر کاربرد : CASE
در نگاه اول شبیه if میمونه که البته باید بگم چند if تو در تو اما از نظر کار کرد و سرعت خیلی با if متفاوته و واضحه که نمیشه همیشه از case بجای if استفاده کرد اما تمام case ها قابلیت جایگزینی با if رو دارند.سرعت case بارها از if بیشتره و لذا در هر جایی که امکان استفاده از case وجود داره بهتره که از این دستور بجای if استفاده بشه

شکل کلی :
case variable in
  pattern [ | pattern] ...) statements;;
  pattern [ | pattern] ...) statements;;
  ...
esac

دقت کنید که هر pattern با دابل سمی کولن خاطمه پیدا میکنه!دلیل این امر هم اونه که شما میتونید چندین خط رو جایگزین statement کنید ولذا دابل سمی کولن وجودش لازمه تا پایان هر pattern رو به سیستم اعلام کنه

در استفاده از case باید دقت کنید زیرا این دستور ترتیبی اجرا میشه و لذا از اولین pattern شرو به چک کردن میکنه و اولین statement هایی رو اجرا میکنه که در زیر اولن pattern قرار داشته باشند که صادق هستش
لذا اگر از پترنی مانند * به عنوان پترن اول استفاده کنید حتما اجرا میشه و فقط هم همین یک پترن اجرا میشه ونه بیشتر حتی اگر پترن های بعدی همخانی بیشتری داشته باشند

حالا بر میگردیم به کد قدیمی خودمون در باره پیغام صبح بخیر یا عصر بخیر (به یاد دارید؟)

#!/bin/sh
echo “Is it morning? Please answer yes or no”
read timeofday
case “$timeofday” in
    yes) echo “Good Morning”;;
    no ) echo “Good Afternoon”;;
    y ) echo “Good Morning”;;
    n ) echo “Good Afternoon”;;
    * ) echo “Sorry, answer not recognized”;;
esac
exit 0

این کد خیلی زیبا تر از کدهای گذشته و سرعتره و جالب اینه که علاوه بر yes , no عبارت های y ,n رو هم شناسایی میکنه که این به زیبایی برنامه کمک میکنه و همونجوری که میبینید در صورتی که عبارت غیر قابل قبولی هم وارد بشه مانند کد های گذشته پیغام و عکس العمل مناسبی رو از خودش بروز میده

ما قبلا در باره عمل گر های منطقی باه مصحبک کرده بودیم
حالا وقت اونه که کد بالا رو خوانا تر و زیبا تر کنیم با حجم کمتر و سرعت اجرای بالا تر(البته سرعت یک چیز آماری در برنامه های بزرگه که بعدا در باره اون صحبت میکنیم)

  #!/bin/sh
   echo “Is it morning? Please answer yes or no”
   read timeofday
case “$timeofday” in
    yes | y | Yes | YES ) echo “Good Morning”;;
    n* | N* )             echo “Good Afternoon”;;
    * )                   echo “Sorry, answer not recognized”;;
esac
exit 0

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

به عنوان مثال یک case یا if رو  در نظر بگیرید
در بعضی موارد ترتیب pattern ها و یا elif ها در نتیجه منطقی برنامه اثری نداره. در این موارد تغییر جای patternها و یا elif ها اثر مستقیمی بر روی سرعت اجرا میذاره و برنامه نویس باید بهترین حالت و چینش رو انخاب کنه
اثر این موارد به این شکله که باید شیوه compile و یا اجرا رو برحسب مورد مورد بررسی قرار داد
در باره case و اجرای اسکریپت ها باید بدونید که در کد بالا اگر به صورت آماری بیشتر جواب n داده میشه بهتره که کد به شکل زیر تغییر کنه تا سرعت (به صورت آماری) افزایش پیدا کنه و دیلی افزایش سرعت هم اینه که یک pattern کمتر تست میشه زیرا با تست اولین pattern برنامه با موفقیت روبرو میشه و لذا pattern های بعدی رو چک نمیکنه و لذا سرعت بالا میره

  #!/bin/sh
   echo “Is it morning? Please answer yes or no”
   read timeofday
case “$timeofday” in
    n* | N* )             echo “Good Afternoon”;;
    yes | y | Yes | YES ) echo “Good Morning”;;
    * )                   echo “Sorry, answer not recognized”;;
esac
exit 0

و حتی اگر در بیشتر موارد جواب به سول فوق مثبته باز هم کد بالا در خط pattern باید بهشکل زیر تغییر کنه چون y بیشتر از yes مورد استفاده قرار میگیره و لذا برنامه با چک کردن عبارت اول وارد پترن میشه و عبارات بعد از | رو چک نمیکنه
y | yes | Yes | YESاز این به بعد کمتر در باره سرعت اجرا حرف میزنیم زیرا اصل سرعت تنها یک دید و برداشت توسط برنامه نویسه و به نظر اون بستگی داره

برای کارایی بیشتر کد فوق باید خروج های متفاوتی برای pattern های مختلف اضافه کنیم که کد به شکل زیر در میاد
#!/bin/sh
echo “Is it morning? Please answer yes or no”
read timeofday
case “$timeofday” in
    yes | y | Yes | YES )
           echo “Good Morning”
           echo “Up bright and early this morning”
           ;;
    [nN]*)
           echo “Good Afternoon”
           ;;
    *)
           echo “Sorry, answer not recognized”
           echo “Please answer yes or no”
           exit 1
           ;;
esac
exit 0

برای اینکه دستورات ما کم حجم تر و خوانا تر بشه باید اون رو به شکل زیر تغییر بدیم تا تمام حالات و چینش های yes رو از نظر بزرگی و کوچکی حروف پوشش بده.برای اینکار از براکت استافاده میکنیم که قبلا خیلی کم در باره اون باهم حرف زده بودیم

[yY]|[Yy][Ee][Ss]
ولذا کد اصلی به شکل زیر در میاد

#!/bin/sh
echo “Is it morning? Please answer yes or no”
read timeofday
case “$timeofday” in
   [yY] | [Yy] [Ee] [Ss] )
           echo “Good Morning”
           echo “Up bright and early this morning”
           ;;
    [nN]*)
           echo “Good Afternoon”
           ;;
    *)
           echo “Sorry, answer not recognized”
           echo “Please answer yes or no”
           exit 1
           ;;
esac
exit 0

بحث درباره list ها :
بعضی وقتها شما لازم دارید تا چند دستور رو با هم و یا به دنبال هم انجام بدید یا چک کنید
وقتی این موضوع برای شما شفاف میشه که قصد چک کردن چندین شرط پیچیده و تو در تو رو داشته باشید
یک راه که البته راه خوبی نیست استفاده از کد زیره
if [ -f this_file ]; then
    if [ -f that_file ]; then
        if [ -f the_other_file ]; then
            echo “All files present, and correct”
        fi
    fi
fi

if [ -f this_file ]; then
   foo=”True”
elif [ -f that_file ]; then
   foo=”True”
elif [ -f the_other_file ]; then
   foo=”True”
else
   foo=”False”
fi
if [ “$foo” = “True” ]; then
   echo “One of the files exists”
fi


بحث بعد رد باره OR List ها و AND List ها خواهد بود

--------------------------------------------------------------------------------------------

ilius جان چرا دیگه پست نمیدی؟
بقیه دوستان هم همچنین
آقا ما منتظریما
اساتید محترم!!!!!هم اکنون نیاز مند یاری سبزتان هستیم
« آخرین ویرایش: 11 شهریور 1388، 11:11 ق‌ظ توسط سید محمود رضا سجادی »
مرکز برنامه نویسی ایران
محلی برای تمامی علاقه مندان به برنامه نویسی http://www.SourceCenter.IR