## 🧩 جایگزینی متغیرهای تو در تو و متغیرهای پیشفرض Bash – بخش ۱۱
### ⚠️ ۱. مشکل جایگزینی متغیرهای تو در تو (Nested Variables)
در Bash، جایگزینی متغیر تنها یک بار انجام میشود. به این معنا که اگر متغیری به نام یک متغیر دیگر نگه دارد، بهصورت مستقیم جایگزین نمیشود.
```bash
declare -rx Linux_best_website="www.tecmint.com"
declare -rx Linux_website="Linux_best_website"
printf "%s\n" "$Linux_website"
# خروجی: Linux_best_website
```
برای اعمال جایگزینی دوتایی، باید از `eval` استفاده کنید:
```bash
declare x=10
declare y=x
eval y=$x
echo "$y" # خروجی: 10
```
`eval` فرمان را دوباره تفسیر کرده و اجازه جایگزینی سطح بالاتر را میدهد ([tecmint.com][1]).
---
### 🔄 ۲. جایگزینی امن با Indirect Expansion (`!`)
Bash امکان ارجاع غیرمستقیم به متغیرها را با `${!var}` پشتیبانی میکند، که مانع استفاده از `eval` میشود:
```bash
foo="HELLO"
ans=foo
echo "${!ans}" # خروجی: HELLO
```
این روش سادهتر و ایمنتر از `eval` است ([stackoverflow.com][2]).
---
### 📚 ۳. متغیرهای پیشتعریفشده در Bash
Bash دارای متغیرهای داخلی بسیار زیادی است. مهمترین مواردی که اغلب در اسکریپتها از آنها استفاده میشود شامل:
* `BASH`, `BASH_VERSION`, `BASH_VERSINFO[]`: نسخه و اطلاعات مربوط به Bash
* `HOME`, `PWD`, `HOSTNAME`: اطلاعات محیط، مسیر جاری، نام میزبان
* `RANDOM`: تولید عدد تصادفی هر بار فراخوانی
* `FUNCNAME`, `BASH_SOURCE`, `LINENO`: برای شناسایی نام تابع، مسیر فایل و شماره خط (کاربرد در اشکالزدایی)
* `COLUMNS`, `LINES`: ابعاد ترمینال
* `EUID`, `PPID`: شناسه کاربر و پردازش والد
* `PIPESTATUS`: نتیجه اجرای آخرین pipeline
* `BASH_ARGV`, `BASH_ARGC`: آرگومانهای فراخواندهشده در توابع یا اسکریپتها
* `PATH`, `ENV`, `BASH_ENV`: برای یافتن مسیر برنامهها و اجرای فایلهای پیکربندی ([tecmint.com][1], [gnu.org][3])
---
### 🧠 نتیجهگیری
* Bash فقط یکبار متغیرها را جایگزین میکند؛ برای جایگزینی سطح بالاتر از `eval` یا `indirect expansion` (`${!var}`) استفاده کنید.
* استفاده از `${!var}` ایمنتر و خواناتر از `eval` است.
* متغیرهای پیشفرض Bash منبع غنیای برای گرفتن اطلاعات محیط اجرا هستند؛ دانستن آنها به شما کمک میکند اسکریپتهای حرفهایتر بنویسید.