کروشه تکی [ ] در مقابل کروشه دوتایی [[ ]]
[ ] همان دستور test است و یک ابزار POSIX استاندارد برای شرطگذاری است که در تمام شلها کار میکند، در حالی که [[ ]] یک کلمه کلیدی خاص Bash است که امکاناتی مثل مقایسه رشته با الگو (pattern matching)، عملگرهای && و || داخلی و جلوگیری از Word Splitting را اضافه میکند.
| ویژگی | کروشه تکی [ ] | کروشه دوتایی [[ ]] |
|---|---|---|
| سازگاری | POSIX، همه شلها | فقط Bash/Ksh/Zsh |
| نیاز به کوت کردن متغیر | ضروری | اختیاریتر و امنتر |
| پشتیبانی از Pattern Matching | ندارد | دارد |
کِی از کروشه تکی [ ] استفاده کنیم؟
وقتی اسکریپت باید با شلهای دیگر غیر از Bash (مثل dash یا sh) هم سازگار باشد و قابلیت جابهجایی (Portability) مهم است.
کِی از کروشه دوتایی [[ ]] استفاده کنیم؟
وقتی مطمئنید اسکریپت فقط با Bash اجرا میشود و میخواهید از قابلیتهای امنتر و قدرتمندتر مثل تطبیق الگو استفاده کنید.
مثال کروشه تکی [ ]
# با [ ] باید متغیرها را کوت کرد
if [ "$name" = "ali" ]; then
echo "match"
fi
مثال کروشه دوتایی [[ ]]
# [[ ]] نیازی به کوت کردن ندارد و از
# == با الگو پشتیبانی میکند
if [[ $file == *.txt ]]; then
echo "text file"
fi
اشتباه رایج
اشتباه رایج فراموش کردن کوت کردن متغیرها در [ ] است؛ اگر متغیر خالی یا شامل فاصله باشد اسکریپت با خطای "unary operator expected" متوقف میشود، مشکلی که در [[ ]] معمولاً رخ نمیدهد.
جمعبندی
برای اسکریپتهای قابل حمل بین شلهای مختلف از [ ] و برای اسکریپتهای مخصوص Bash با شرطهای پیچیدهتر از [[ ]] استفاده کنید.
