انجمنهای فارسی اوبونتو
کمک و پشتیبانی => برنامهسازی => نویسنده: 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 هم بنویسه ولی نمینویسه .
پیشاپیش ممنون.
-
اشکال نداره من یه سوال نامربوط بپرسم؟
خواستم ببینم فرق bash با shell چیه؟
-
اشکال نداره من یه سوال نامربوط بپرسم؟
خواستم ببینم فرق bash با shell چیه؟
bash یک shell است.
تو خروجی بالا باید پشت hello و world عدد 123 هم بنویسه ولی نمینویسه .
پیشاپیش ممنون.
من هیج دلیلی نمی بینم که ۱۲۳ چاپ شه.میشه بگید چرا باید ۱۲۳ چاپ شه؟
وقتی می نویسید e hello توی تابع e مقدار $1 در حقیقت hello هست که همونم چاپ میشه.
-
تو خروجی بالا باید پشت hello و world عدد 123 هم بنویسه ولی نمینویسه .
پیشاپیش ممنون.
من هیج دلیلی نمی بینم که ۱۲۳ چاپ شه.میشه بگید چرا باید ۱۲۳ چاپ شه؟
وقتی می نویسید e hello توی تابع e مقدار $1 در حقیقت hello هست که همونم چاپ میشه.
[/quote]
علامت
$1
میگه که مقداری که موقع اجرایه اسکریپت نوشته شده رو برداره میشه همون "پارامتر"
مثلا اینو نگاه کنین :
#!/bin/bash
x=1
echo $1 $x
خروجیش میشه این :
$ . ./0-103 132
132 1
-
علامت
$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
-
واقعا ممنون . این قسمت شل اسکریپت خیلی داره اذیت میکنه. این مشکل حل شد. پس اگر خاستیم متغیری تو یک تابع استفاده کنیم باید به اون تابع متغیرمون رو بفرستیم.
پس شکل پایانی اسکریپت این جوری میشه :
#!/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" در چی هست ؟
پیشاپیش ممنون.
-
پس اگر خاستیم متغیری تو یک تابع استفاده کنیم باید به اون تابع متغیرمون رو بفرستیم.
اگه متغیره جزو $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
-
سلام واقعا ممنون برایه پاسخ کاملتون.
2 سوال کاملا حل شدن .
------------------------------------
عنوان موضوع رو به "مجموعه سوالات از شل اسکریپتینگ " تغییر دادم
-
ویرایش شد :
-------------
سلام دوستان:
اگر کاربر قرار باشه 5 تا عدد وارد کنه که بعد اون 5تا عدد رو وارد یک ارایه کنیم .
شکل هایه مختلفی تست کردم ولی نشد مثلا :
x=0
while [ $x -lt 5 ]; do
read ${numbers[$x]}
done
پیشاپیش ممنون
-
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 رو با امتححان کردن یاد میگیری؟ خوب یه کتابشو از نت پیدا کن بخون :)
-
ممنون مشکل حل شد.
نه با امتحان کردن یاد نمیگیرم از رو اموزش لینوکس روییو میخونم بعضی قسمتا مثل ارایه ها با حلقه ها رو اصلا خوب نگفته.
http://wiki.linuxreview.ir/Shell-scripting-tutorial
کتاب پیشنهادی شما چه کتابی هست ؟
-
سلام
من کتاب آموزش اسکریپت نویسی bashlinux.persiangig.com/bbg/html/index.html (http://bashlinux.persiangig.com/bbg/html/index.html) را پیشنهاد می کنم