## 🌀 درک متغیرها در اسکریپتنویسی Bash – بخش ۹
### 🔸 متغیر چیست و چرا مهم است؟
* متغیرها محل ذخیره موقت داده در حافظه هستند و میتوان مقدار خروجی دستورها یا دادههای کاربر را در آنها نگه داشت ([tecmint.com][1]).
* سرعت دسترسی آنها نسبت به فایل سریعتر است زیرا در حافظه نگهداری میشوند .
---
### 📌 اعلام و مقداردهی متغیر
* استفاده از دستور `declare` برای تعریف متغیر:
```bash
declare LEVEL
```
* مقداردهی:
```bash
LEVEL=0
```
*توجه:* در مقابل `LEVEL =` (با فاصله) اشتباه است.
* دسترسی به مقدار با پیشوند `$`:
```bash
echo "$LEVEL"
```
* دستور `unset LEVEL` برای حذف متغیر مورد استفاده قرار میگیرد ([tecmint.com][1]).
---
### 🆚 تفاوت متغیر تعریفشده و NULL
* وقتی متغیر بدون مقدار تعریف شود (`declare LEVEL`)، مقدار آن `0` و در printf نیز نمایش `0` را خواهد داشت. اما دسترسی و محاسبه بعدی متفاوت است .
---
### 🔄 قوانین نامگذاری
1. معنیدار بودن نام متغیر
2. پیروی از یک استاندارد (معمولاً با حروف بزرگ)
3. پیشگیری از اشتباه با استفاده از ترکیبهای واضح مانند `TOTAL_BILLED_AMOUNT`, `ORDER_ID` ([tecmint.com][1]).
---
### 💡 انواع متغیرهای پیشتعریفشده Bash
Bash شامل بیش از ۵۰ متغیر داخلی است، برخی از آنها:
* `BASH`, `BASH_VERSION`, `HOME`, `PWD`, `HOSTNAME`, `RANDOM`, `SHELL`, `TERM`, `PATH`, `PPID` و… ([tecmint.com][1]).
* **RANDOM** در هر بار فراخوانی یک عدد تصادفی جدید تولید میکند.
* توصیه شده تا متغیری با نام مشابه این موارد تعریف نشود، تا از بروز تداخل جلوگیری شود .
---
### 🧩 اهمیت استفاده از کوتیشن (`""`)
* بدون کوتیشن، فضای خالی بهعنوان جداکننده پارامتر قلمداد میشود:
```bash
LEVEL="0 ; 1 ; 2"
printf "%s" $LEVEL # تنها "0" را چاپ میکند
printf "%s" "$LEVEL" # کل رشته را با فواصل نگهداریشده چاپ میکند
```
.
* استفاده از `${LEVEL}` کمک میکند رشتهها بهدرستی الحاق شوند:
```bash
FLAG="I passed LEVEL ${LEVEL}!"
```
([tecmint.com][1]).
---
### 🔐 بکاسلش (`\`)
* جلوی یک کاراکتر خاص میگذارد تا نسخهی escape چاپ شود، مانند چاپ `"`:
```bash
printf "%c" "\""
```
* گزینهی `%q` در `printf`، بکاسلش را برای ایمنسازی رشتهها درج میکند:
```bash
printf "%q" "$FLAG"
```
---
## ✅ جمعبندی
| جنبه | توضیح |
| --------------------------- | -------------------------------------------------- |
| **انواع متغیرها** | تعریفشده با `declare`، مقداردهیشده، پیشفرض Bash |
| **نکته مهم** | همیشه متغیرها را با کوتیشن `"$VAR"` فراخوانی کنید |
| **پیشفرضهای Bash** | از تعریف مجدد آنها خودداری کنید |
| **کاربرد بکاسلش و printf** | برای چاپ امن و رشتهای |
این بخش، نکات کلیدی در مورد رفتار متغیرها، ایمنسازی آنها هنگام چاپ یا استفاده، و تفاوتهای subtle بین حالتهای مختلف تعریف را پوشش میدهد و پایه مناسبی برای ادامهدادن به بخشهای آتی مثل export یا nested variables فراهم میآورد ([appservgrid.com][2]).