در Bash، گسترش (Expansion) فرآیندی است که در آن الگوهای خاص قبل از اجرای دستور به مقادیر واقعی تبدیل میشوند. این قابلیت به کاربران اجازه میدهد مسیرهای فایل را مدیریت کنند، محاسبات ریاضی انجام دهند و رشتههای متنی متعددی را بهطور پویا تولید کنند.
این مقاله انواع گسترشها شامل گسترش مسیر فایل، گسترش ~، محاسبات ریاضی، و گسترش {} برسی را بررسی میکند.
گسترش مسیر فایل (*, ?, [])
گسترش مسیر فایل هنگام کار با کاراکترهای جایگزین (wildcards) برای مطابقت با نام فایلها استفاده میشود.
مثال: گسترش * برای لیست کردن فایلها
echo *
خروجی (لیست تمام فایلهای موجود در دایرکتوری فعلی):
bash
Desktop Documents Pictures Videos
همچنین میتوان الگوهای خاص را مطابقت داد:
echo D*
خروجی:
bash
Desktop Documents
مدیریت فایلهای مخفی در گسترش مسیر فایل
بهطور پیشفرض، فایلهای مخفی (شروعشده با .) در گسترشها نمایش داده نمیشوند. استفاده از .* فایلهای مخفی را نمایش میدهد اما همچنین شامل . (دایرکتوری فعلی) و .. (دایرکتوری والد) میشود:
ls -d .* | less
روش بهتر:
echo .[!.]*
این دستور فقط فایلهای مخفی را نمایش میدهد، بدون . و ... بهطور جایگزین، ls -A لیستی دقیق ارائه میدهد:
ls -A
گسترش ~ (تایلد) برای دایرکتوری خانه
کاراکتر ~ نمایانگر دایرکتوری خانه یک کاربر است.
مثال: گسترش ~ برای کاربر فعلی
echo ~
خروجی:
bash
/home/user
برای کاربری دیگر، نام کاربر را قبل از ~ اضافه کنید:
echo ~foo
خروجی:
bash
/home/foo
گسترش محاسبات ریاضی ($((...)))
گسترش محاسباتی امکان انجام محاسبات ریاضی را در پوسته فراهم میکند.
مثال: محاسبات ساده
echo $((2 + 2))
خروجی:
bash
4
عملگرهای پشتیبانیشده:
عملگر | توضیح |
+ | جمع |
- | تفریق |
* | ضرب |
/ | تقسیم عدد صحیح |
% | باقیمانده تقسیم (modulo) |
** | توان (Exponentiation) |
مثال با توان و ضرب:
echo $(((5**2) * 3))
خروجی:
bash
75
از آنجا که اعشاری پشتیبانی نمیشود، نتیجه گرد میشود:
echo $((5 / 2))
خروجی:
bash
2
گسترش {} برای تولید رشتههای متنی متعدد
گسترش {} امکان تولید چندین نسخه از یک رشته را بهصورت پویا فراهم میکند.
مثال: گسترش یک الگوی متنی
echo Front-{A,B,C}-Back
خروجی:
bash
Front-A-Back Front-B-Back Front-C-Back
اعداد نیز میتوانند بهترتیب تولید شوند:
echo Number_{1..5}
خروجی:
bash
Number_1 Number_2 Number_3 Number_4 Number_5
برای اعداد با صفر پیشفرض (Bash 4.0+):
echo {01..15}
خروجی:
bash
01 02 03 04 05 ... 15
حروف نیز میتوانند بهترتیب معکوس گسترش یابند:
echo {Z..A}
خروجی:
bash
Z Y X ... B A
استفاده از گسترش {} برای ایجاد دایرکتوریها
گسترش {} برای ایجاد گروهی از دایرکتوریها بسیار مفید است. مثال: سازماندهی عکسها براساس سال و ماه:
mkdir Photos cd Photos mkdir {2007..2009}-{01..12}
دایرکتوریهای ایجادشده:
bash
2007-01 2007-02 ... 2009-12
Bash مکانیزمهای قدرتمندی برای مدیریت متغیرها، اجرای دستورات پویا، و کنترل تفسیر متن ارائه میدهد. این مکانیزمها شامل:
گسترش پارامتر (Parameter Expansion) – دسترسی به مقادیر متغیرهای ذخیرهشده.
جایگزینی دستور (Command Substitution) – استفاده از خروجی یک دستور بهعنوان ورودی.
تکنیکهای نقلقول (Quoting) – کنترل چگونگی تفسیر کاراکترهای خاص در Bash.
این مقاله نحوه مدیریت متغیرها، جایگزینی دستورات، و انواع نقلقولها را بررسی میکند تا اجرای دستورات در Bash بهینه شود.
گسترش پارامتر ($VAR)
گسترش پارامتر امکان دریافت مقادیر ذخیرهشده در متغیرها را فراهم میکند.
مثال: نمایش نام کاربری با $USER
echo $USER
خروجی:
bash
me
برای مشاهده تمام متغیرهای سیستم از این دستور استفاده کنید:
printenv | less
اگر یک متغیر تعریف نشده باشد، گسترش مقدار رشتهی خالی را برمیگرداند:
echo $SUER
خروجی:
bash
(empty)
جایگزینی دستور ($(COMMAND))
جایگزینی دستور کاربران را قادر میسازد یک دستور را اجرا کنند و از خروجی آن بهعنوان آرگومان یا متغیر استفاده کنند.
مثال: لیست کردن فایلها با جایگزینی دستور
echo $(ls)
خروجی (لیست تمام فایلها در دایرکتوری فعلی):
bash
Desktop Documents Pictures Videos
مثال: استفاده از which برای یافتن cp و ارسال آن به ls
ls -l $(which cp)
این دستور مسیر کامل cp را پیدا کرده و جزئیات آن را با ls نمایش میدهد.
مثال: استفاده از پایپلاینها در جایگزینی دستور
جایگزینی دستور از پایپلاینها نیز پشتیبانی میکند:
file $(ls -d /usr/bin/* | grep zip)
این دستور فایلهای مربوط به zip را فیلتر کرده و اطلاعات آنها را با file تحلیل میکند.
سینتکس جایگزین با بکتیک
سینتکس قدیمی جایگزینی دستور از بکتیک () بهجای$()** استفاده میکند:
ls -lwhich cp
اگرچه پشتیبانی میشود، **استفاده از$()` توصیه میشود زیرا خوانایی بهتری دارد.
تکنیکهای نقلقول
نقلقول به کنترل چگونگی پردازش کاراکترهای خاص و گسترشها در Bash کمک میکند.
مثال: جداسازی کلمات بدون نقلقول
echo this is a test
خروجی:
bash
this is a test
در اینجا، فضاها بهعنوان جداکنندهی کلمات عمل میکنند و متن را به چند آرگومان تقسیم میکنند.
مثال: استفاده از نقلقول برای حفظ فضاها
echo "this is a test"
اکنون، فضاها درون آرگومان باقی میمانند و متن بهعنوان یک رشتهی واحد پردازش میشود.
مدیریت کاراکترهای خاص در نقلقولها
استفاده از نقلقول دوگانه (" ") مانع جداسازی کلمات، گسترش مسیر فایل و گسترش {} میشود، اما گسترش پارامتر، محاسبات ریاضی، و جایگزینی دستور همچنان انجام میشود.
مثال: محافظت از گسترش متغیر با نقلقولها
echo "The total is $100.00"
بدون نقلقول، $1 تعریف نشده است، که خروجی نادرست ایجاد میکند:
bash
The total is 00.00
استفاده از نقلقولها باعث تفسیر صحیح متن میشود.
اثر نقلقولها بر جایگزینی دستور
نقلقول در جایگزینی دستور باعث میشود فضاها و خطوط جدید متفاوت پردازش شوند.
مثال: اجرای cal بدون نقلقول
echo $(cal)
خروجی (همه فضاها حذفشده، تبدیل به یک خط شده است):
bash
February 2020 Su Mo Tu We Th Fr Sa 1 2 3 4 5 6 ... 28 29
مثال: اجرای cal با نقلقولها
echo "$(cal)"
خروجی (حفظ خطوط جدید و فضاها):
bash
February 2020
Su Mo Tu We Th Fr Sa
1
2 3 4 5 6 7 8
9 10 11 12 13 ... 28 29
اینجا، نقلقولها قالببندی خروجی را حفظ میکنند.
درک نقلقولهای تک (' ')، فراریسازی (\)، و کدهای کنترلی (\n, \t و غیره) در Bash به کاربران کمک میکند تفسیر متن، جایگزینی متغیرها، و کنترل رفتار کاراکترهای خاص را مدیریت کنند. این ابزارها باعث میشوند کاراکترهای خاص در نام فایلها، متغیرها و اجرای دستورات بهدرستی پردازش شوند.
این مقاله نحوه سرکوب گسترشها با نقلقول تک، جلوگیری از رفتارهای ناخواسته با فراریسازی، و استفاده از توالیهای کنترلی برای اصلاح خروجی متن را بررسی میکند.
استفاده از نقلقول تک (' ')
نقلقول تک تمام گسترشها را حذف میکند، از جمله جایگزینی متغیرها، جایگزینی دستور، گسترش ریاضی، و تفسیر کاراکترهای خاص.
مقایسه نقلقولهای بدون علامت، نقلقولهای دوگانه، و نقلقولهای تک
بدون نقلقول: گسترشها بهطور عادی اتفاق میافتند.
echo text ~/*.txt {a,b} $(echo foo) $((2+2)) $USER
خروجی:
bash
text /home/me/ls-output.txt a b foo 4 me
نقلقول دوگانه: برخی گسترشها حفظ میشوند، اما مسیر فایل و {} سرکوب میشوند.
echo "text ~/*.txt {a,b} $(echo foo) $((2+2)) $USER"
خروجی:
bash
text ~/*.txt {a,b} foo 4 me
نقلقول تک: تمام گسترشها سرکوب میشوند.
echo 'text ~/*.txt {a,b} $(echo foo) $((2+2)) $USER'
خروجی:
bash
text ~/*.txt {a,b} $(echo foo) $((2+2)) $USER
این روش تضمین میکند متن دقیقاً همانطور که نوشتهشده نمایش دادهشود.
فراریسازی کاراکترها (\)
کاراکتر فراری (\) به کاربران اجازه میدهد کاراکترهای خاص را بهصورت عادی پردازش کنند، بدون عملکرد ویژهی آنها. موارد رایج استفاده شامل:
جلوگیری از جایگزینی متغیرها
فراریسازی کاراکترهای خاص در نام فایلها
اطمینان از پردازش صحیح کاراکترهای ویژه
مثال: فراریسازی $ برای جلوگیری از جایگزینی متغیر
echo "The balance for user $USER is: $5.00"
خروجی:
bash
The balance for user me is: $5.00
بدون فراریسازی، $5.00 بهعنوان متغیر تعریفنشده ($5) پردازش میشود و خروجی نادرست ایجاد میکند.
مثال: فراریسازی کاراکترهای خاص در نام فایلها
mv bad\&filename good_filename
از آنجا که & در Bash معنی خاصی دارد، فراریسازی تضمین میکند که بهعنوان کاراکتر عادی پردازش شود.
فراریسازی بکاسلش (\) خود
برای وارد کردن یک \ واقعی، از \\ استفاده کنید:
echo "Backslash: \\"
خروجی:
bash
Backslash: \
درون نقلقول تک، \ معنای خاص خود را از دست میدهد و بهعنوان یک کاراکتر عادی پردازش میشود.
کدهای کنترلی بکاسلش (\n, \t و غیره)
۳۲ کاراکتر اول ASCII برای ارسال فرمان به دستگاههای ترمینالی استفاده میشوند که برخی از آنها در اسکریپتنویسی رایج هستند.
کدهای کنترلی متداول
توالی فراری | معنی |
\a | بل (باعث بوق زدن رایانه میشود) |
\b | حذف نویسهی قبلی (backspace) |
\n | خط جدید (line feed) |
\r | بازگشت به اول خط (carriage return) |
\t | تب (Tab) |
کدهای کنترلی از زبان برنامهنویسی C سرچشمه گرفتهاند و در اسکریپتنویسی پوسته کاربرد دارند.
استفاده از توالیهای کنترلی در echo
برای تفسیر توالیهای فراری در echo، از -e یا $' ' استفاده کنید.
مثال: ایجاد تایمر شمارش معکوس با sleep و \a
sleep 10; echo -e "Time's up\a"
یا بهطور جایگزین:
sleep 10; echo "Time's up" $'\a'
با اجرای این دستور، ترمینال پس از ۱۰ ثانیه بوق میزند.