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

کمک و پشتیبانی => برنامه‌سازی => نویسنده: alieblice در 27 شهریور 1391، 03:12 ب‌ظ

عنوان: مجموعه سوالات از شل اسکریپتینگ.
ارسال شده توسط: alieblice در 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 هم بنویسه ولی نمینویسه .
پیشاپیش ممنون.
عنوان: پاسخ : تابع e در اسکریپت bash کار نمیکند
ارسال شده توسط: mohammad_d در 27 شهریور 1391، 04:50 ب‌ظ
اشکال نداره من یه سوال نامربوط بپرسم؟

خواستم ببینم فرق bash با shell چیه؟
عنوان: پاسخ : تابع e در اسکریپت bash کار نمیکند
ارسال شده توسط: shervinkh در 27 شهریور 1391، 05:21 ب‌ظ
نقل‌قول
اشکال نداره من یه سوال نامربوط بپرسم؟

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

bash یک shell است.

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

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

وقتی می نویسید e hello توی تابع e مقدار $1 در حقیقت hello هست که همونم چاپ میشه.
عنوان: پاسخ : تابع e در اسکریپت bash کار نمیکند
ارسال شده توسط: alieblice در 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
عنوان: پاسخ : تابع e در اسکریپت bash کار نمیکند
ارسال شده توسط: shervinkh در 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
عنوان: پاسخ : تابع e در اسکریپت bash کار نمیکند
ارسال شده توسط: alieblice در 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" در چی هست ؟

پیشاپیش ممنون.
عنوان: پاسخ : تابع e در اسکریپت bash کار نمیکند
ارسال شده توسط: shervinkh در 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
عنوان: پاسخ : تابع e در اسکریپت bash کار نمیکند
ارسال شده توسط: alieblice در 27 شهریور 1391، 11:15 ب‌ظ
سلام واقعا ممنون برایه پاسخ کاملتون.
2 سوال کاملا حل شدن .
------------------------------------
عنوان موضوع رو به "مجموعه سوالات از شل اسکریپتینگ " تغییر دادم
عنوان: پاسخ : وارد کردن مقدار در یک ارایه .
ارسال شده توسط: alieblice2 در 01 مهر 1391، 04:13 ب‌ظ
ویرایش شد :
-------------
سلام دوستان:

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

x=0
while [ $x -lt 5 ]; do
        read ${numbers[$x]}
done
پیشاپیش ممنون
عنوان: پاسخ : مجموعه سوالات از شل اسکریپتینگ.
ارسال شده توسط: shervinkh در 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 رو با امتححان کردن یاد میگیری؟ خوب یه کتابشو از نت پیدا کن بخون  :)
عنوان: پاسخ : مجموعه سوالات از شل اسکریپتینگ.
ارسال شده توسط: alieblice در 02 مهر 1391، 11:26 ق‌ظ
ممنون مشکل حل شد.
نه با امتحان کردن یاد نمیگیرم از رو اموزش  لینوکس روییو میخونم بعضی قسمتا مثل ارایه ها با حلقه ها رو اصلا خوب نگفته.
http://wiki.linuxreview.ir/Shell-scripting-tutorial
کتاب پیشنهادی شما چه کتابی هست ؟

عنوان: پاسخ : مجموعه سوالات از شل اسکریپتینگ.
ارسال شده توسط: mahrooz در 19 آبان 1391، 12:25 ب‌ظ
سلام
من کتاب آموزش اسکریپت نویسی  bashlinux.persiangig.com/bbg/html/index.html (http://bashlinux.persiangig.com/bbg/html/index.html)  را پیشنهاد می کنم