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

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

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

نویسنده موضوع: مجموعه سوالات از شل اسکریپتینگ.  (دفعات بازدید: 2776 بار)

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

آفلاین alieblice

  • High Hero Member
  • *
  • ارسال: 1275
مجموعه سوالات از شل اسکریپتینگ.
« : 27 شهریور 1391، 03:12 ب‌ظ »
سلام دوستان .
تو اسکریپت زیر هر چی بالا پایینش کردم نفهمیدم چرا تابع e کار نمیکنه .

متن اسکریپت :

#!/bin/bash 
function e {
echo $1
}
e Hello
e World
echo foo

خروجی وقتی اجراش میکنم :
$ ./0-100 123
Hello
World
foo
تو خروجی بالا باید پشت hello و world عدد 123 هم بنویسه ولی نمینویسه .
پیشاپیش ممنون.
« آخرین ویرایش: 27 شهریور 1391، 11:16 ب‌ظ توسط alieblice »

آفلاین mohammad_d

  • Jr. Member
  • *
  • ارسال: 47
پاسخ : تابع e در اسکریپت bash کار نمیکند
« پاسخ #1 : 27 شهریور 1391، 04:50 ب‌ظ »
اشکال نداره من یه سوال نامربوط بپرسم؟

خواستم ببینم فرق bash با shell چیه؟

آفلاین shervinkh

  • Full Member
  • *
  • ارسال: 197
  • جنسیت : پسر
  • An ENFP
    • سایت شخصی
پاسخ : تابع e در اسکریپت bash کار نمیکند
« پاسخ #2 : 27 شهریور 1391، 05:21 ب‌ظ »
نقل‌قول
اشکال نداره من یه سوال نامربوط بپرسم؟

خواستم ببینم فرق bash با shell چیه؟

bash یک shell است.

نقل‌قول
تو خروجی بالا باید پشت hello و world عدد 123 هم بنویسه ولی نمینویسه .
پیشاپیش ممنون.

من هیج دلیلی نمی بینم که ۱۲۳ چاپ شه.میشه بگید چرا باید ۱۲۳ چاپ شه؟

وقتی می نویسید e hello توی تابع e مقدار $1 در حقیقت hello هست که همونم چاپ میشه.
Gentoo KDE x86_64
Notebook:Asus N53SN
www.shervin.org

آفلاین alieblice

  • High Hero Member
  • *
  • ارسال: 1275
پاسخ : تابع e در اسکریپت bash کار نمیکند
« پاسخ #3 : 27 شهریور 1391، 06:46 ب‌ظ »
نقل‌قول
تو خروجی بالا باید پشت hello و world عدد 123 هم بنویسه ولی نمینویسه .
پیشاپیش ممنون.

من هیج دلیلی نمی بینم که ۱۲۳ چاپ شه.میشه بگید چرا باید ۱۲۳ چاپ شه؟

وقتی می نویسید e hello توی تابع e مقدار $1 در حقیقت hello هست که همونم چاپ میشه.
[/quote]

علامت
$1
میگه که مقداری که موقع اجرایه اسکریپت نوشته شده رو برداره میشه همون "پارامتر"

مثلا اینو نگاه کنین :

#!/bin/bash
x=1
echo $1 $x
خروجیش میشه این :

$ . ./0-103 132
132 1

آفلاین shervinkh

  • Full Member
  • *
  • ارسال: 197
  • جنسیت : پسر
  • An ENFP
    • سایت شخصی
پاسخ : تابع e در اسکریپت bash کار نمیکند
« پاسخ #4 : 27 شهریور 1391، 08:03 ب‌ظ »
علامت
$1
میگه که مقداری که موقع اجرایه اسکریپت نوشته شده رو برداره میشه همون "پارامتر"

مثلا اینو نگاه کنین :

#!/bin/bash
x=1
echo $1 $x
خروجیش میشه این :

$ . ./0-103 132
132 1

شما اگه بیرون یک تابع بنویسید $1 به معنی اولین رشته ای هست که توی command-line داده شده(همون ۱۲۳ در اینجا).ولی اگه توی یک تابع بنویسید به معنی اولین رشته ای هست که به تابع داده شده.

درسته که echo $1 در بیرون یک تابع اولین پارامتر command-line که در مثال شما همون ۱۲۳ هست رو چاپ میکنه ولی اگه داخل یک تابع بنویسید echo $1 اولین چیزی که به تایع فرستادید رو چاپ میکنه.

در کل یعنی معنی $1 در بیرون و درون یک تابع فرق داره.

می تونید یه چنین کاری کنید : (دقیقش رو نمیدونم)

#!/bin/bash 
function e {
echo $1 $2
}
e $1 Hello
e $1 World
echo foo

در اینصورت قبل از hello و world یه 123 چاپ میشه.یعنی اگه می خواید از رشته های command-line (در اینجا ۱۲۳) استفاده کنید باید $1 یا $2 يا ... رو به تابع بفرستید.

البته راه های دیگه ای هم هست مثلا:

#!/bin/bash
tempvar=$1
function e {
echo $tempvar $1
}
e Hello
e World
echo foo

جفت کد های بالا خروجیش چنین چیزی میشه:
[shervinkh@Leo145-Notebook ~]$ ./1.bash 123
123 Hello
123 World
foo
Gentoo KDE x86_64
Notebook:Asus N53SN
www.shervin.org

آفلاین alieblice

  • High Hero Member
  • *
  • ارسال: 1275
پاسخ : تابع e در اسکریپت bash کار نمیکند
« پاسخ #5 : 27 شهریور 1391، 08:58 ب‌ظ »
واقعا ممنون . این قسمت شل اسکریپت خیلی داره اذیت میکنه. این مشکل حل شد. پس اگر خاستیم متغیری تو یک تابع استفاده کنیم باید به اون تابع متغیرمون رو بفرستیم.
پس شکل پایانی اسکریپت این جوری میشه :

#!/bin/bash 
function e {
echo $1
}
e "$1 Hello"
e "$1 World"
echo foo

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

2 تا سوال دیگه .


از نیم ساعت پیش دارم باهاش سروکله میزنم نمیتونم حلش کنم

متن اسکریپت :
#!/bin/bash
x="taghsim zarb gam menha"
y=10
select sign in $x; do
 if [ "$sign" = "taghsim" ]; then
        echo $(($y/2))
 else if ["$sign"="zarb"]; then
        echo $(($y*2))
 else if ["$sign"="gam"]; then
        echo $(($y+2))
 else
        echo $(($y-2))
        fi

اینم ارورش : اخر اسکریپت done که میزارم بازم ارور میده .

$ . ./1005
bash: ./1005: line 14: syntax error: unexpected end of file


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

سوال 2وم:
فرق "else if" و "elif" در چی هست ؟

پیشاپیش ممنون.

آفلاین shervinkh

  • Full Member
  • *
  • ارسال: 197
  • جنسیت : پسر
  • An ENFP
    • سایت شخصی
پاسخ : تابع e در اسکریپت bash کار نمیکند
« پاسخ #6 : 27 شهریور 1391، 09:28 ب‌ظ »
نقل‌قول
پس اگر خاستیم متغیری تو یک تابع استفاده کنیم باید به اون تابع متغیرمون رو بفرستیم.

اگه متغیره جزو $1  و $2 و... نباشه فکر کنم تو تابع هم می تونه استفاده شه بدون فرستادن.

در مورد سوال دوم:
۱− در شرط if حواستون باشه space گذاری رو رعایت کنید فقط [ "$sign" = "taghsim" ] رو درست نوشتید بقیه space کم دارن که باعث میشه خطا پیش بیاد.
۲− با تبدیل elseif ها به elif و گذاشتن done در آخر کدتون درست میشه.

#!/bin/bash
x="taghsim zarb gam menha"
y=10
select sign in $x; do
if [ "$sign" = "taghsim" ]; then
        echo $(($y/2))
  elif [ "$sign" = "zarb" ]; then
        echo $(($y*2))
  elif [ "$sign" = "gam" ]; then
echo $(($y+2))
  else
        echo $(($y-2))
  fi
done

در مورد سوال سوم:
ساختار شرط bash به این شکل هست:

if condition
then
statements
[elif condition
then statements...]
[else
statements]
fi

درستش اینه که از elif استفاده کنید ولی از else if هم میشه استفاده کرد که یکم نکته داره استفاده ازش.برای مثال کدتون آخرش باید ۳ تا fi داشته باشه.اینم دلیلش  :D :

#!/bin/bash
x="taghsim zarb gam menha"
y=10
select sign in $x; do
if [ "$sign" = "taghsim" ]; then
echo $(($y/2))
else
if [ "$sign" = "zarb" ]; then
echo $(($y*2))
else
if [ "$sign" = "gam" ]; then
echo $(($y+2))
else
echo $(($y-2))
fi
fi
fi
done

فکر کنم با این دندانه گذاری فرق else if با elif واضح باشه.else if در حقیقت مثل اینه که در داخل بلاک else یک شرط if گذاشته شه.
و این که دندانه گذاری هم همیشه رعایت کنید تا اشکالات این چنین کمتر شه  ;)

مثلا کد بالا رو میشه این جوری هم نوشت (ولی خوب نا واضح و زشته) (البته در کل else if زشته) :):

#!/bin/bash
x="taghsim zarb gam menha"
y=10
select sign in $x; do
if [ "$sign" = "taghsim" ]; then
echo $(($y/2))
else if [ "$sign" = "zarb" ]; then
echo $(($y*2))
else if [ "$sign" = "gam" ]; then
echo $(($y+2))
else
echo $(($y-2))
fi
fi
fi
done
« آخرین ویرایش: 27 شهریور 1391، 09:32 ب‌ظ توسط shervinkh »
Gentoo KDE x86_64
Notebook:Asus N53SN
www.shervin.org

آفلاین alieblice

  • High Hero Member
  • *
  • ارسال: 1275
پاسخ : تابع e در اسکریپت bash کار نمیکند
« پاسخ #7 : 27 شهریور 1391، 11:15 ب‌ظ »
سلام واقعا ممنون برایه پاسخ کاملتون.
2 سوال کاملا حل شدن .
------------------------------------
عنوان موضوع رو به "مجموعه سوالات از شل اسکریپتینگ " تغییر دادم

آفلاین alieblice2

  • Sr. Member
  • *
  • ارسال: 280
پاسخ : وارد کردن مقدار در یک ارایه .
« پاسخ #8 : 01 مهر 1391، 04:13 ب‌ظ »
ویرایش شد :
-------------
سلام دوستان:

اگر کاربر قرار باشه 5 تا عدد وارد کنه که بعد اون 5تا عدد رو وارد یک ارایه کنیم .
شکل هایه مختلفی تست کردم ولی نشد مثلا :

x=0
while [ $x -lt 5 ]; do
        read ${numbers[$x]}
done
پیشاپیش ممنون
« آخرین ویرایش: 01 مهر 1391، 07:25 ب‌ظ توسط alieblice2 »

آفلاین shervinkh

  • Full Member
  • *
  • ارسال: 197
  • جنسیت : پسر
  • An ENFP
    • سایت شخصی
پاسخ : مجموعه سوالات از شل اسکریپتینگ.
« پاسخ #9 : 01 مهر 1391، 10:27 ب‌ظ »
for ((i=0; i < 20; i++)) do
read numbers[$i];
done

و اگه می خوای به جای enter زدن بین عدد ها فاصله بزنی این:
for ((i=0; i < 20; i++)) do
read -d ' ' numbers[$i];
done

bash رو با امتححان کردن یاد میگیری؟ خوب یه کتابشو از نت پیدا کن بخون  :)
Gentoo KDE x86_64
Notebook:Asus N53SN
www.shervin.org

آفلاین alieblice

  • High Hero Member
  • *
  • ارسال: 1275
پاسخ : مجموعه سوالات از شل اسکریپتینگ.
« پاسخ #10 : 02 مهر 1391، 11:26 ق‌ظ »
ممنون مشکل حل شد.
نه با امتحان کردن یاد نمیگیرم از رو اموزش  لینوکس روییو میخونم بعضی قسمتا مثل ارایه ها با حلقه ها رو اصلا خوب نگفته.
http://wiki.linuxreview.ir/Shell-scripting-tutorial
کتاب پیشنهادی شما چه کتابی هست ؟


آفلاین mahrooz

  • Newbie
  • *
  • ارسال: 14
پاسخ : مجموعه سوالات از شل اسکریپتینگ.
« پاسخ #11 : 19 آبان 1391، 12:25 ب‌ظ »
سلام
من کتاب آموزش اسکریپت نویسی  bashlinux.persiangig.com/bbg/html/index.html  را پیشنهاد می کنم