CodeShot

کروشه تکی [ ] در مقابل کروشه دوتایی [[ ]]

[ ] همان دستور 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 با شرط‌های پیچیده‌تر از [[ ]] استفاده کنید.