## 🧠 عمقبخشیدن به پیچیدگی توابع در Bash – بخش ۷
مقاله به بررسی ویژگیهای پیشرفتهتر توابع در اسکریپت Bash پرداخته، مانند **متغیرهای محلی** و **بازگشتپذیری (recursive functions)**.
---
### 🔐 ۱. متغیرهای محلی در تابع
* با استفاده از `local` میتوانید متغیری با حوزه (scope) محدود به داخل تابع تعریف کنید.
* مثال:
```bash
func() {
local i=10
j=20
echo "i داخل تابع = $i"
echo "j داخل تابع = $j"
}
func
echo "i بیرون تابع = $i" # خالی خواهد بود
echo "j بیرون تابع = $j" # مقدار 20 را نشان میدهد
```
شرح اینکه فقط `j` در خارج تابع قابل دسترسی است، ولی `i` محلی مانده و خارج نخواهد شد ([tecmint.com][1]).
---
### 🔁 ۲. بازگشتپذیری (Recursion)
#### 🔸 استفاده از local و بازگشتی بودن برای محاسبه فاکتوریل
نمونه تابع بازگشتی برای محاسبه `n!`:
```bash
fact() {
local num=$1
if [ $num -eq 0 ]; then
ret=1
else
local temp=$((num - 1))
fact $temp
ret=$((num * $?))
fi
return $ret
}
fact 5
echo "فاکتوریل ۵ = $?"
```
در اینجا `$?` مقدار بازگشتی فراخوانی بازگشتی قبلی را میگیرد .
⚠️ نکته: بازگشت بزرگتر از ۸ تاب ممکن نیست (بخشی از محدودیتهای سیستمعامل).
---
#### 🔸 بازگشتپذیری بدون local: دنباله فیبوناچی
یک تابع بازگشتی برای نمایش اعداد فیبوناچی بدون استفاده از متغیر local:
```bash
fib() {
a=$1
if [ $a -lt 2 ]; then
echo $a
else
((--a)); b=$(fib $a)
((--a)); c=$(fib $a)
echo $((b + c))
fi
}
for i in $(seq 0 15); do
out=$(fib $i)
echo $out
done
```
این روش بدون `local` عمل میکند؛ البته کمی **کند و منابعبر** خواهد بود .
---
### ✅ جمعبندی بخش VII
* ✅ یاد گرفتیم **چطور از متغیر محلی در توابع** برای جلوگیری از نشت داده استفاده کنیم.
* ✅ آموختیم **بازگشتپذیری** را در Bash تعریف کنیم (مثال: فاکتوریل و فیبوناچی).
* ⚠️ توجه کردیم که استفاده از بازگشتی بودن در Bash نواقصی دارد، از جمله محدودیت در بازگشت عددی و عملکرد ضعیف نسبت به زبانهای کامپایلری.