یکی از قدرتمندترین ویژگیهای شلهای یونیکس، قابلیت گسترش (Expansion) است. زمانی که یک دستور را تایپ میکنید، شل قبل از اجرای آن، الگوها و کاراکترهای خاصی را توسعه (Expand) میدهد و آنها را به لیستی از فایلها، مسیرها یا رشتههای متناسب تبدیل میکند. به این فرآیند، Globbing (یا Pathname Expansion) نیز گفته میشود.
درک این مفاهیم به شما امکان میدهد که با نوشتن الگوهای کوتاه، عملیات پیچیدهای روی تعداد زیادی فایل یا داده انجام دهید.
Wildcards / Globbing
Wildcards (یا کاراکترهای جایگزین) نمادهایی هستند که میتوانند با یک یا چند کاراکتر در نام فایلها مطابقت داشته باشند. این ویژگی به شما اجازه میدهد که گروهی از فایلها را با یک الگوی ساده انتخاب کنید.
سه کاراکتر wildcard اصلی در شل عبارتند از: *، ? و [].
* (Asterisk / Star)
نماد ستاره (*) با هر تعداد کاراکتر (از صفر تا بینهایت) مطابقت دارد. این پرکاربردترین wildcard است.
مثالها
-
انتخاب تمام فایلهای با پسوند
.txt:ls *.txtاین دستور تمام فایلهایی را که با
.txtختم میشوند، لیست میکند (مانندfile.txt،notes.txt،data_backup.txt). -
انتخاب تمام فایلهایی که با
logشروع میشوند:ls log*فایلهایی مانند
log.txt،logfile.log،log_2024_01_01.txtرا انتخاب میکند. -
انتخاب تمام فایلها در دایرکتوری فعلی:
ls *همهی فایلها و دایرکتوریها را لیست میکند (البته فایلهای مخفی که با
.شروع میشوند را شامل نمیشود). -
حذف تمام فایلهای با پسوند
.tmpدر دایرکتوری فعلی:rm *.tmpتمام فایلهای موقت را یکجا حذف میکند.
-
کپی تمام فایلهای با پیشوند
backupبه دایرکتوریarchive/:cp backup* archive/ -
استفاده با
*در وسط الگو (فایلهایی که شاملdraftهستند):ls *draft*فایلهایی مانند
draft.txt،report_draft.pdf،draft_final.docxرا انتخاب میکند.
نکته:
*به تنهایی (بدون هیچ کاراکتر دیگری) با همهی فایلهای غیرمخفی مطابقت دارد، اما با دایرکتوریها نیز مطابقت میکند. همچنین فایلهای مخفی (شروع با.) را نادیده میگیرد مگر اینکه صراحتاً آنها را مشخص کنید (مثلاً.*).
? (Question Mark)
نماد علامت سوال (?) با دقیقاً یک کاراکتر (هر کاراکتری) مطابقت دارد.
مثالها
-
انتخاب فایلهایی با یک کاراکتر بین
fileو.txt:ls file?.txtبا
file1.txt،fileA.txt،file_.txtمطابقت دارد، اما باfile10.txtیاfile.txtمطابقت ندارد. -
انتخاب فایلهایی با یک حرف یا عدد در موقعیت مشخص:
ls report_?.logبا
report_1.log،report_A.logمطابقت دارد، اما باreport_12.logمطابقت ندارد. -
چند
?پشت سر هم برای تعداد کاراکترهای دقیق:ls file??.txtبا
file01.txt،fileAB.txt،file_1.txtمطابقت دارد (دقیقاً دو کاراکتر بینfileو.txt).
[] (Square Brackets / Character Classes)
براکتهای مربعی [] به شما اجازه میدهند که یک مجموعه یا محدودهای از کاراکترها را مشخص کنید. الگو با دقیقاً یکی از کاراکترهای داخل براکت مطابقت دارد.
ساختارها
| ساختار | توضیح | مثال |
|---|---|---|
[abc] | یکی از کاراکترهای a، b یا c | file[123].txt با file1.txt، file2.txt و file3.txt مطابقت دارد. |
[a-z] | یک کاراکتر در محدودهی a تا z (حروف کوچک) | file[a-z].txt با filea.txt تا filez.txt مطابقت دارد. |
[A-Z] | یک کاراکتر در محدودهی A تا Z (حروف بزرگ) | file[A-Z].txt با fileA.txt تا fileZ.txt مطابقت دارد. |
[0-9] | یک کاراکتر در محدودهی 0 تا 9 (اعداد) | file[0-9].txt با file0.txt تا file9.txt مطابقت دارد. |
[!abc] یا [^abc] | هر کاراکتری به جز a، b یا c | file[!0-9].txt با فایلهایی که یک کاراکتر غیرعددی دارند مطابقت دارد. |
مثالها
-
انتخاب فایلهایی که با
a،bیاcشروع میشوند:ls [abc]*
با
apple.txt،banana.log،car.pdfمطابقت دارد، اما باdog.txtمطابقت ندارد. -
انتخاب فایلهایی که با یک عدد ختم میشوند:
ls *[0-9].txt
با
file1.txt،report2.txtمطابقت دارد، اما باfileA.txtمطابقت ندارد. -
انتخاب فایلهایی که پسوند آنها حروف بزرگ است:
ls *.[A-Z][A-Z][A-Z]
با
report.JPG،image.PNGمطابقت دارد. -
ترکیب محدودهها:
ls file[a-zA-Z0-9].txt
با
filea.txt،fileZ.txt،file5.txtمطابقت دارد.
نکته:
[]مثل?با دقیقاً یک کاراکتر مطابقت دارد، اما با محدود کردن آن به مجموعهای خاص.
Brace Expansion
Brace Expansion (یا گسترش آکولاد) با استفاده از آکولادهای {} انجام میشود و به شما اجازه میدهد که رشتههای متنی دلخواه را تولید کنید. این ویژگی توسط شل انجام میشود و مستقل از وجود فایلها است. به عبارت دیگر، برخلاف wildcardها، نیازی نیست که فایلها وجود داشته باشند.
ساختارها
| ساختار | توضیح | مثال |
|---|---|---|
{a,b,c} | لیستی از رشتهها | file{1,2,3}.txt به file1.txt file2.txt file3.txt تبدیل میشود. |
{1..5} | محدودهی عددی | file{1..5}.txt به file1.txt تا file5.txt تبدیل میشود. |
{a..z} | محدودهی حروف الفبا | file{a..d}.txt به filea.txt تا filed.txt تبدیل میشود. |
{1..10..2} | محدوده با گام (Step) | {1..10..2} به 1 3 5 7 9 تبدیل میشود. |
{a,b{1..3},c} | آکولادهای تو در تو | {a,b{1,2,3},c} به a b1 b2 b3 c تبدیل میشود. |
مثالها
-
ایجاد چند دایرکتوری بهصورت همزمان:
mkdir -p project/{src,docs,tests}
این دستور سه دایرکتوری
project/src،project/docsوproject/testsرا ایجاد میکند. (با-pدایرکتوریprojectنیز ساخته میشود.) -
ساخت فایلهای با شمارهگذاری:
touch report_{1..10}.txt
ده فایل خالی از
report_1.txtتاreport_10.txtایجاد میشود. -
ساخت فایلهای با حروف الفبا:
touch {a..z}.txt
۲۶ فایل از
a.txtتاz.txtایجاد میشود. -
ساخت فایلهایی با ترکیبهای مختلف:
touch {jan,feb,mar}_{2024,2025}.log
فایلهایی مانند
jan_2024.log،jan_2025.log،feb_2024.logو ... ایجاد میشود. -
ساخت محدوده با گام:
echo {1..10..3} # خروجی: 1 4 7 10
-
ساخت محدودههای عددی با پیشوند صفر (Zero-padding):
echo {01..10} # خروجی: 01 02 03 ... 10
Tilde Expansion
Tilde Expansion با علامت تیلدا (~) انجام میشود و به دایرکتوری خانه (Home Directory) کاربر اشاره میکند.
ساختارها
| ساختار | توضیح |
|---|---|
~ | دایرکتوری خانهی کاربر فعلی. |
~username | دایرکتوری خانهی کاربر username. |
~+ | دایرکتوری کاری فعلی (معادل $PWD). |
~- | دایرکتوری قبلی (معادل $OLDPWD). |
مثالها
-
رفتن به دایرکتوری خانه:
cd ~ # معادل cd /home/username
-
رفتن به دایرکتوری خانهی کاربر
root:cd ~root # معادل cd /root
-
ارجاع به یک فایل در دایرکتوری خانه:
cat ~/.rc # معادل cat /home/username/.rc
-
رفتن به دایرکتوری قبلی:
cd ~- # معادل cd -
Variable Expansion
Variable Expansion به شما اجازه میدهد که به مقدار یک متغیر دسترسی پیدا کنید. در شل، متغیرها با علامت $ قبل از نام متغیر، گسترش (Expand) میشوند.
مثالها
-
نمایش مقدار یک متغیر:
name="Ali" echo $name # خروجی: Ali
-
نمایش متغیرهای محیطی:
echo $HOME # خروجی: /home/username echo $PATH # خروجی: /usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin echo $SHELL # خروجی: /bin/
-
استفاده از متغیر در دستورات:
FILE="myfile.txt" cat $FILE # معادل cat myfile.txt
-
استفاده از آکولاد برای جدا کردن نام متغیر:
PREFIX="backup" touch ${PREFIX}_2024.txt # فایل backup_2024.txt ایجاد میشود
نکته: برای دسترسی به متغیرها درون رشتههای با نقلقول دوگانه (
" ")، از$استفاده کنید. در نقلقولهای تکی (' ')، متغیرها گسترش نمییابند.
Command Substitution
Command Substitution به شما اجازه میدهد که خروجی یک دستور را بهعنوان بخشی از دستور دیگر استفاده کنید. دو روش برای انجام این کار وجود دارد: استفاده از بکتیک (Backticks) یا $(...).
ساختار کلی:
command1 $(command2) # یا command1 `command2`
مثالها
-
ذخیرهی تاریخ فعلی در یک متغیر:
today=$(date +%Y-%m-%d) echo $today # خروجی: 2024-07-27
-
ایجاد یک فایل با نام شامل تاریخ:
touch backup_$(date +%Y%m%d).tar.gz # فایل backup_20240727.tar.gz ایجاد میشود
-
شمارش تعداد فایلهای یک دایرکتوری و نمایش پیام:
echo "There are $(ls -1 | wc -l) files in this directory."
-
استفاده از خروجی یک دستور بهعنوان آرگومان دستور دیگر:
cd $(dirname $(which python)) # به دایرکتوری حاوی فایل اجرایی python میرود
-
استفاده از
findدرcp:cp $(find . -name "*.txt") backup/
همهی فایلهای
.txtدر زیرشاخهها را به دایرکتوریbackup/کپی میکند.
نکته: استفاده از
$(...)نسبت به بکتیک (`) ارجح است، زیرا تو در تو (Nested) شدن در آن راحتتر است و خوانایی بیشتری دارد.
Arithmetic Expansion
Arithmetic Expansion به شما اجازه میدهد که محاسبات ریاضی را درون شل انجام دهید. این کار با استفاده از $((...)) انجام میشود.
ساختار کلی:
$((expression))
عملگرهای ریاضی
| عملگر | توضیح |
|---|---|
+ | جمع |
- | تفریق |
* | ضرب (نیاز به escape ندارد در $((...))) |
/ | تقسیم (اعداد صحیح) |
% | باقیمانده (Modulo) |
** | توان |
مثالها
-
جمع دو عدد:
echo $((5 + 3)) # خروجی: 8
-
استفاده از متغیرها در محاسبات:
a=10 b=3 echo $((a + b)) # خروجی: 13 echo $((a / b)) # خروجی: 3 (چون تقسیم صحیح است) echo $((a % b)) # خروجی: 1
-
توان:
echo $((2 ** 10)) # خروجی: 1024
-
افزایش یک متغیر:
count=5 ((count++)) # معادل count=$((count + 1)) echo $count # خروجی: 6
-
استفاده در حلقهها:
for i in {1..10}; do echo $((i * i)) done
مربع اعداد ۱ تا ۱۰ را چاپ میکند.
خلاصه و جدول مقایسهی انواع Expansion
| نوع Expansion | نماد/ساختار | توضیح | مثال |
|---|---|---|---|
| Wildcard / Globbing | *, ?, [] | مطابقت با نام فایلها | ls *.txt |
| Brace Expansion | {} | تولید رشتههای دلخواه (مستقل از فایل) | touch file{1..10}.txt |
| Tilde Expansion | ~ | اشاره به دایرکتوری خانه | cd ~/Documents |
| Variable Expansion | $VAR | دسترسی به مقدار متغیر | echo $HOME |
| Command Substitution | $(command) یا `command` | جایگزینی با خروجی یک دستور | echo $(date) |
| Arithmetic Expansion | $((expr)) | انجام محاسبات ریاضی | echo $((5 + 3)) |
ترتیب انجام Expansionها
شل این گسترشها را به ترتیب زیر انجام میدهد (ترتیب مهم است):
-
Brace Expansion (
{}) -
Tilde Expansion (
~) -
Variable Expansion (
$VAR) -
Command Substitution (
$(...)) -
Arithmetic Expansion (
$((...))) -
Pathname Expansion / Globbing (
*,?,[])
نکات پیشرفته
-
غیرفعال کردن Expansion (با استفاده از نقلقولها):
-
نقلقول تکی (
' '): همهی Expansionها را غیرفعال میکند. -
نقلقول دوگانه (
" "): بیشتر Expansionها را غیرفعال میکند، اما$(Variable و Command Substitution) و`و\را غیرفعال نمیکند.
echo 'My home is $HOME' # خروجی: My home is $HOME echo "My home is $HOME" # خروجی: My home is /home/username
-
-
استفاده از
set -xبرای دیدن فرآیند Expansion:set -x ls *.txt set +x
این کار به شما نشان میدهد که شل هر دستور را چگونه پس از Expansion اجرا میکند.
-
استفاده از
evalبرای انجام Expansion دو مرحلهای:var=ls eval $var
evalدستور را دو بار پردازش میکند و امکان استفاده از متغیرها بهعنوان خود دستور را فراهم میکند.
این محتوا کاملا رایگان توسط تیم کدلپر ترجمه شده و در اختیار شما کاربران عزیز قرار گرفته است، هر گونه کپی برداری برای مقاصد غیر رایگان و بدون ذکر منبع، مورد پیگیری قانونی قرار میگیرد.
ترجمه شده از منبع: منبع مستندات