PDA

View Full Version : تعریف تابع با آرگومان در اسکریپت شل



aarash_v
پنج شنبه 16 آبان 1387, 22:52 عصر
سلام. توی زبان هایی مثل C تابع یک همچین جوری تعریف میشه: مثلا:
int f(int a)
{
اعمال
} می خواستم ببینم توی شل لینوکس چطوری میشه تابعی رو تعریف کرد که ورودی (آرگومان) داشته باشه. (بدون آرگومانش رو بلدم ولی اینطوریش رو بلد نیستم) :متفکر:

ilius.gnu
دوشنبه 20 آبان 1387, 07:52 صبح
سلام.
ببخشید دیر شد. این مثال رو بخونید و اجراش کنید(خروجی رو ببینید) اگه متوجه نشدید بگید توضیح بدم:

#!/bin/bash
function showArgs(){
echo "Arg1 = '$1'"
echo "Arg2 = '$2'"
echo "Args count = $#"
echo "Args array = '$@'"
echo "Args array = '$*'"
echo

i=1
for A in "$@" ; do
echo "Arg$i = '$A'"
i=$[i+1]
done
echo

Args=( "$@" )
i=0
while [ $i -lt $# ] ; do
echo "Arg$[i+1] = '${Args[$i]}'"
i=$[i+1]
done
}


showArgs arg1 "second arg" "arg 3" "4th argument"

aarash_v
دوشنبه 27 آبان 1387, 15:44 عصر
اگه میشه لطف کنید توضیح بدید. ممنون

asm.coder
سه شنبه 28 آبان 1387, 18:00 عصر
شما فکر کن یه تابع iecho داری که میخوای۲تا آرگومان بگیره و اوناره echo کنه.
شما اول تابع iecho رو اینطوری صدا میزنی:

iecho argtestA argtestBحالا تو تابع فقط لازمه آرگومان هارو با $ و شماره آرگومان به دست بیاری :

function iecho {
echo $1
echo $2
}
$1 یعنی آرگومان اول و $2 یعنی آرگومان دوم و ....
حالا شما می خوای ببینی کلا چندتا آرگومان وارد شده با #$ به دست میاری . که تعداد آرگومان هارو بر می گردونه.

#!/bin/bash
function iecho {
echo $1
echo $2
}
iecho argtestA argtestB
خروجیش اینه :

$./test.sh
argtestA
argtestB
www.chuug.org/talks/20070424/jmalone-chuug-bash_scripting.pdf (http://www.chuug.org/talks/20070424/jmalone-chuug-bash_scripting.pdf)

aarash_v
چهارشنبه 29 آبان 1387, 16:33 عصر
حالا اگه بخوایم یک تابع بازگشتی تعریف کنیم چه کار باید بکنیم؟ چون نیاز داریم که تابع ما یک چیزی رو return کنه...
مثلا تابع فاکتوریل رو باید در زبان C این طوری تعریف کرد:


int f(int a){
if(a < 0) return 0;
return (!a ? 1 : a * f(a - 1));
}

asm.coder
چهارشنبه 29 آبان 1387, 16:58 عصر
return رو هم می تونید با ?$ به دست بیارید .
همون مثال قبلی :

#!/bin/bash
function iecho {
echo $1
echo $2
return $(($1+$2))
}
iecho 1 2 3
echo $?
خروجیش

$./test.sh
1
2
3

ilius.gnu
شنبه 02 آذر 1387, 15:43 عصر
سلام. ببخشید که فراموش کردم.
فکر می‌کنم دیگه تقریبا متوجه شده باشید. مثلاً این برای فاکتوریل

#!/bin/bash
function fact(){
[[ $1 > -1 ]] || exit 1
if [[ $1 = 0 ]] ; then
return 1
else
fact $[$1-1]
return $[$?*$1]
fi
}

fact 5
echo $?البته اگه اسکریپت رو توی فایل نوشته باشید این خط آخرش باید توی خود ترمینال نوشته بشه(نمی‌دونم چرا توی فایل باشه صفر چاپ میکنه!)
در ضمن زیاد از return توی اسکریپت شل استفاده نمیشه. مثلاً این بدون return هست:


#!/bin/bash
function fact2(){
[[ $1 > -1 ]] || exit 1
if [[ $1 = 0 ]] ; then
echo 1
else
echo $[$1*`fact2 $[$1-1]`]
fi
}

fact2 5این علامت علامت ‍` که دکمه‌ش زیر Esc هست بهش میگن back quote و توی شل وقتی یه عبارت رو به این علامت محصور کنید، اون رو بعنوان دستور فرض میکنه و اجراش میکنه و خروجیش رو برمی‌گردونه(جایگزین عبارت میکنه).
دربارهٔ این این خط:

echo $[$1*`fact2 $[$1-1]`]اون []$ برای عبارت محاسباتی هست. مثلاً:

echo $[2008-1991]
echo $[20*30]پس توی اون عبارت میاد آرگومان اول( 1$ ) رو ضرب میکنه در خروجی اون چیزی که داخل back quote گذاشتیم(یعنی فاکتوریل مقدار قبلی) که در نهایت میشه فاکتوریل همین مقدار 1$ بعد چاپش میکنه.

خوب با دقت بخونید اگه بازم جایی متوجه نشدید بپرسید.