یکی از قدرتمندترین ویژگیهای شلهای یونیکس، قابلیت گسترش (Expansion) است. زمانی که یک دستور را تایپ میکنید، شل قبل از اجرای آن، الگوها و کاراکترهای خاصی را توسعه (Expand) میدهد و آنها را به لیستی از فایلها، مسیرها یا رشتههای متناسب تبدیل میکند. به این فرآیند، Globbing (یا Pathname Expansion) نیز گفته میشود.
درک این مفاهیم به شما امکان میدهد که با نوشتن الگوهای کوتاه، عملیات پیچیدهای روی تعداد زیادی فایل یا داده انجام دهید.
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 (یا گسترش آکولاد) با استفاده از آکولادهای {} انجام میشود و به شما اجازه میدهد که رشتههای متنی دلخواه را تولید کنید. این ویژگی توسط شل انجام میشود و مستقل از وجود فایلها است. به عبارت دیگر، برخلاف 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 با علامت تیلدا (~) انجام میشود و به دایرکتوری خانه (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 به شما اجازه میدهد که به مقدار یک متغیر دسترسی پیدا کنید. در شل، متغیرها با علامت $ قبل از نام متغیر، گسترش (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 به شما اجازه میدهد که خروجی یک دستور را بهعنوان بخشی از دستور دیگر استفاده کنید. دو روش برای انجام این کار وجود دارد: استفاده از بکتیک (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 به شما اجازه میدهد که محاسبات ریاضی را درون شل انجام دهید. این کار با استفاده از $((...)) انجام میشود.
ساختار کلی:
$((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 | نماد/ساختار | توضیح | مثال |
|---|---|---|---|
| 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)) |
شل این گسترشها را به ترتیب زیر انجام میدهد (ترتیب مهم است):
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 دستور را دو بار پردازش میکند و امکان استفاده از متغیرها بهعنوان خود دستور را فراهم میکند.
این محتوا کاملا رایگان توسط تیم کدلپر ترجمه شده و در اختیار شما کاربران عزیز قرار گرفته است، هر گونه کپی برداری برای مقاصد غیر رایگان و بدون ذکر منبع، مورد پیگیری قانونی قرار میگیرد.
ترجمه شده از منبع: منبع مستندات