Add sitemap and styles for Persian font integration
- Created a new sitemap.xml file for better SEO. - Added a compressed version of the sitemap as sitemap.xml.gz. - Introduced extra.css for custom styles, including Persian font support (IRANSansX). - Defined font-face rules for regular and bold styles of IRANSansX. - Implemented various text styles and layout adjustments for better readability. - Enhanced Mermaid diagram styles to support Persian text rendering.
This commit is contained in:
Executable
Executable
+8
@@ -0,0 +1,8 @@
|
|||||||
|
SOURCE="./hard-view"
|
||||||
|
|
||||||
|
for u in stu1009061173 stu1009061300 stu1022916013 stu1023061235 stu1023061257 stu1023061304 stu1023061337 stu1023061359 stu1023061622 stu1023061906 stu1032916021 stu1032916043 stu2022916034 stu9823061117; do
|
||||||
|
sudo cp -a "$SOURCE" "/home/$u/" && \
|
||||||
|
sudo chown -R "$u:students" "/home/$u/$(basename "$SOURCE")" && \
|
||||||
|
sudo chmod -R 770 "/home/$u/$(basename "$SOURCE")" && \
|
||||||
|
sudo chmod g+s "/home/$u/$(basename "$SOURCE")"
|
||||||
|
done
|
||||||
Executable
Executable
Executable
Executable
Executable
Executable
Executable
Executable
Executable
Executable
Executable
Executable
Executable
Executable
Executable
Executable
Executable
Executable
Executable
+21
@@ -0,0 +1,21 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
|
||||||
|
groupadd -f students
|
||||||
|
|
||||||
|
students=(
|
||||||
|
1023061622
|
||||||
|
)
|
||||||
|
|
||||||
|
for student in "${students[@]}"
|
||||||
|
do
|
||||||
|
username="stu$student"
|
||||||
|
useradd -m -s /bin/bash -g students "$username"
|
||||||
|
|
||||||
|
|
||||||
|
echo "$username:123456789" | chpasswd
|
||||||
|
|
||||||
|
|
||||||
|
chage -d 0 "$student"
|
||||||
|
|
||||||
|
done
|
||||||
@@ -0,0 +1,49 @@
|
|||||||
|
{"answers.md": {"created": "2025-12-18T15:34:58+03:30"}}
|
||||||
|
{"chapter1.md": {"created": "2025-12-18T15:34:58+03:30"}}
|
||||||
|
{"chapter2.md": {"created": "2025-12-18T15:34:58+03:30"}}
|
||||||
|
{"chapter3.md": {"created": "2025-12-18T15:34:58+03:30"}}
|
||||||
|
{"exam3.md": {"created": "2025-12-18T15:34:58+03:30"}}
|
||||||
|
{"exercise1.md": {"created": "2025-12-18T15:34:58+03:30"}}
|
||||||
|
{"exercise10.md": {"created": "2025-12-18T15:34:58+03:30"}}
|
||||||
|
{"exercise2.md": {"created": "2025-12-18T15:34:58+03:30"}}
|
||||||
|
{"exercise3.md": {"created": "2025-12-18T15:34:58+03:30"}}
|
||||||
|
{"exercise4.md": {"created": "2025-12-18T15:34:58+03:30"}}
|
||||||
|
{"exercise5.md": {"created": "2025-12-18T15:34:58+03:30"}}
|
||||||
|
{"exercise6.md": {"created": "2025-12-18T15:34:58+03:30"}}
|
||||||
|
{"exercise7.md": {"created": "2025-12-18T15:34:58+03:30"}}
|
||||||
|
{"exercise8.md": {"created": "2025-12-18T15:34:58+03:30"}}
|
||||||
|
{"exercise9.md": {"created": "2025-12-18T15:34:58+03:30"}}
|
||||||
|
{"index.md": {"created": "2026-04-28T13:21:12.471048+03:30"}}
|
||||||
|
{"lesson1.md": {"created": "2025-12-18T15:34:58+03:30"}}
|
||||||
|
{"lesson10.md": {"created": "2025-12-18T15:34:58+03:30"}}
|
||||||
|
{"lesson11.md": {"created": "2025-12-18T15:34:58+03:30"}}
|
||||||
|
{"lesson2-1.md": {"created": "2025-12-18T15:34:58+03:30"}}
|
||||||
|
{"lesson2-10.md": {"created": "2025-12-18T15:34:58+03:30"}}
|
||||||
|
{"lesson2-11.md": {"created": "2025-12-18T15:34:58+03:30"}}
|
||||||
|
{"lesson2-2.md": {"created": "2025-12-18T15:34:58+03:30"}}
|
||||||
|
{"lesson2-3.md": {"created": "2025-12-18T15:34:58+03:30"}}
|
||||||
|
{"lesson2-4.md": {"created": "2025-12-18T15:34:58+03:30"}}
|
||||||
|
{"lesson2-5.md": {"created": "2025-12-18T15:34:58+03:30"}}
|
||||||
|
{"lesson2-6.md": {"created": "2025-12-18T15:34:58+03:30"}}
|
||||||
|
{"lesson2-7.md": {"created": "2025-12-18T15:34:58+03:30"}}
|
||||||
|
{"lesson2-8.md": {"created": "2025-12-18T15:34:58+03:30"}}
|
||||||
|
{"lesson2-9.md": {"created": "2025-12-18T15:34:58+03:30"}}
|
||||||
|
{"lesson2.md": {"created": "2025-12-18T15:34:58+03:30"}}
|
||||||
|
{"lesson3-1.md": {"created": "2025-12-18T15:34:58+03:30"}}
|
||||||
|
{"lesson3-2.md": {"created": "2025-12-18T15:34:58+03:30"}}
|
||||||
|
{"lesson3-3.md": {"created": "2025-12-18T15:34:58+03:30"}}
|
||||||
|
{"lesson3-4.md": {"created": "2025-12-18T15:34:58+03:30"}}
|
||||||
|
{"lesson3-5.md": {"created": "2025-12-18T15:34:58+03:30"}}
|
||||||
|
{"lesson3-6.md": {"created": "2025-12-18T15:34:58+03:30"}}
|
||||||
|
{"lesson3-7.md": {"created": "2025-12-18T15:34:58+03:30"}}
|
||||||
|
{"lesson3-8.md": {"created": "2025-12-18T15:34:58+03:30"}}
|
||||||
|
{"lesson3-9.md": {"created": "2025-12-18T15:34:58+03:30"}}
|
||||||
|
{"lesson3.md": {"created": "2025-12-18T15:34:58+03:30"}}
|
||||||
|
{"lesson4.md": {"created": "2025-12-18T15:34:58+03:30"}}
|
||||||
|
{"lesson5.md": {"created": "2025-12-18T15:34:58+03:30"}}
|
||||||
|
{"lesson6.md": {"created": "2025-12-18T15:34:58+03:30"}}
|
||||||
|
{"lesson7.md": {"created": "2025-12-18T15:34:58+03:30"}}
|
||||||
|
{"lesson8.md": {"created": "2025-12-18T15:34:58+03:30"}}
|
||||||
|
{"lesson9.md": {"created": "2025-12-18T15:34:58+03:30"}}
|
||||||
|
{"linux-course.md": {"created": "2026-04-28T13:23:07.682468+03:30"}}
|
||||||
|
{"programming-languages.md": {"created": "2026-04-28T13:17:04.811052+03:30"}}
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
.dates_cache.jsonl merge=union
|
||||||
+146
@@ -0,0 +1,146 @@
|
|||||||
|
# پاسخ تمرینها
|
||||||
|
|
||||||
|
در این صفحه، پاسخهای پیشنهادی و مختصر برای تمرینها آورده شدهاند. این صفحه در منوی اصلی قرار نگرفته است.
|
||||||
|
|
||||||
|
## تمرین ۱: دیدن سخت — پاسخ نهایی
|
||||||
|
فقط سه خط `ls` مطابق صورت سؤال:
|
||||||
|
|
||||||
|
```
|
||||||
|
ls -lth
|
||||||
|
ls -lth ../alireza
|
||||||
|
ls -lth ../../arshia/sub
|
||||||
|
```
|
||||||
|
|
||||||
|
## تمرین ۲: بازی بازی — فرمانها
|
||||||
|
|
||||||
|
```
|
||||||
|
# حذف کامل پوشه arshia
|
||||||
|
rm -r -- bazi-bazi/arshia
|
||||||
|
|
||||||
|
# ساخت ali/reza و زنجیره s/a/l/i/b
|
||||||
|
mkdir -p bazi-bazi/ali/reza
|
||||||
|
mkdir -p bazi-bazi/s/a/l/i/b
|
||||||
|
```
|
||||||
|
|
||||||
|
## تمرین ۳: دفترچه تیمی — فرمانها
|
||||||
|
|
||||||
|
```
|
||||||
|
# ساخت ساختار و فایلهای روزانه
|
||||||
|
mkdir -p ~/notebook/daily ~/notebook/ideas
|
||||||
|
cd ~/notebook
|
||||||
|
|
||||||
|
touch daily/day-01.txt daily/day-02.txt daily/day-03.txt
|
||||||
|
|
||||||
|
# ایجاد و نوشتن سه ایده در brainstorm.txt
|
||||||
|
printf "Idea 1\nIdea 2\nIdea 3\n" > ideas/brainstorm.txt
|
||||||
|
|
||||||
|
# تجمیع ایدهها در یک فایل
|
||||||
|
cat ideas/brainstorm.txt >> ideas/all-ideas.txt
|
||||||
|
|
||||||
|
# تأیید: تعداد خطوط و سپس نمایش محتوا
|
||||||
|
wc -l ideas/all-ideas.txt && cat ideas/all-ideas.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
## تمرین ۴: بایگانی پروژه — فرمانها
|
||||||
|
|
||||||
|
```
|
||||||
|
# 1) نسخه پشتیبان src در backup/src-copy
|
||||||
|
mkdir -p ~/mini-project/backup
|
||||||
|
cp -r ~/mini-project/src ~/mini-project/backup/src-copy
|
||||||
|
|
||||||
|
# 2) تغییر نام و جابهجایی draft.txt به notes.txt در ریشه پروژه
|
||||||
|
mv ~/mini-project/tmp/draft.txt ~/mini-project/notes.txt
|
||||||
|
|
||||||
|
# 3) حذف old.log
|
||||||
|
rm ~/mini-project/tmp/old.log
|
||||||
|
|
||||||
|
# 4) حذف tmp در صورت خالی بودن
|
||||||
|
rmdir ~/mini-project/tmp
|
||||||
|
```
|
||||||
|
|
||||||
|
## تمرین ۵: شکار گزینهٔ درست — یکخطی نهایی
|
||||||
|
|
||||||
|
```
|
||||||
|
find ~/Downloads -type f -size +5M -exec ls -lh {} +
|
||||||
|
```
|
||||||
|
- `-type f`: فقط فایلها
|
||||||
|
- `-size +5M`: بزرگتر از ۵ مگابایت
|
||||||
|
- `-exec ls -lh {} +`: نمایش خروجی با اندازهٔ خوانا
|
||||||
|
|
||||||
|
## تمرین ۶: تقویم تیم پشتیبان — فرمانها
|
||||||
|
|
||||||
|
```
|
||||||
|
# 1) تاریخ/زمان فعلی در قالب خواستهشده
|
||||||
|
date +"%Y-%m-%d %H:%M" > support-schedule.txt
|
||||||
|
|
||||||
|
# 2) ماه جاری و دو ماه بعد، با یک خط خالی بین هر ماه
|
||||||
|
for i in 0 1 2; do
|
||||||
|
cal $(date -d "+$i month" +"%m %Y") >> support-schedule.txt
|
||||||
|
echo >> support-schedule.txt
|
||||||
|
done
|
||||||
|
|
||||||
|
# 3) استخراج شمارهٔ هفتههای ماه جاری و افزودن به انتهای فایل
|
||||||
|
ncal -w | awk 'NR>1 {print $NF}' | paste -sd ' ' - | \
|
||||||
|
sed 's/^/Current month weeks: /' >> support-schedule.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
## تمرین ۷: پایپلاین خطاگیر — یکخطی پایدار
|
||||||
|
|
||||||
|
```
|
||||||
|
# فقط فایلهای متنی .log پردازش میشوند؛ خطاها در pipeline-errors.log ذخیره میشود
|
||||||
|
grep -h "ERROR" ~/logs/service-*.log 2>> ~/logs/pipeline-errors.log \
|
||||||
|
| tee -a ~/logs/errors-full.log \
|
||||||
|
| tee /dev/tty \
|
||||||
|
| wc -l > ~/logs/error-count.txt
|
||||||
|
```
|
||||||
|
- `grep -h "ERROR"`: فیلتر خطوط خطا از فایلهای `service-*.log`
|
||||||
|
- `2>> pipeline-errors.log`: ثبت خطاهای احتمالی اجرای دستور
|
||||||
|
- `tee -a errors-full.log`: ذخیرهٔ کامل خطوط فیلترشده (ضمیمه)
|
||||||
|
- `tee /dev/tty`: نمایش همزمان در صفحه
|
||||||
|
- `wc -l > error-count.txt`: شمارش کل خطاها و نوشتن در فایل
|
||||||
|
|
||||||
|
## تمرین ۸: یادداشتِ مریخی — نمونهحل خیلی ساده (Bash)
|
||||||
|
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
read -r q
|
||||||
|
|
||||||
|
EXISTS=0
|
||||||
|
CONTENT=""
|
||||||
|
|
||||||
|
i=0
|
||||||
|
while [ "$i" -lt "$q" ]
|
||||||
|
do
|
||||||
|
read -r OP TEXT
|
||||||
|
|
||||||
|
if [ "$OP" = "touch" ]
|
||||||
|
then
|
||||||
|
if [ "$EXISTS" = "0" ]; then
|
||||||
|
EXISTS=1
|
||||||
|
CONTENT=""
|
||||||
|
fi
|
||||||
|
elif [ "$OP" = ">" ]
|
||||||
|
then
|
||||||
|
EXISTS=1
|
||||||
|
CONTENT="$TEXT"
|
||||||
|
elif [ "$OP" = ">>" ]
|
||||||
|
then
|
||||||
|
EXISTS=1
|
||||||
|
if [ -z "$CONTENT" ]; then
|
||||||
|
CONTENT="$TEXT"
|
||||||
|
else
|
||||||
|
CONTENT="$CONTENT
|
||||||
|
$TEXT"
|
||||||
|
fi
|
||||||
|
fi
|
||||||
|
|
||||||
|
i=$((i + 1))
|
||||||
|
done
|
||||||
|
|
||||||
|
if [ "$EXISTS" = "0" ] || [ -z "$CONTENT" ]; then
|
||||||
|
echo "EMPTY"
|
||||||
|
else
|
||||||
|
printf '%s\n' "$CONTENT"
|
||||||
|
fi
|
||||||
|
```
|
||||||
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,41 @@
|
|||||||
|
# فصل یک
|
||||||
|
|
||||||
|
## توضیحات فصل ۱
|
||||||
|
در این فصل با دستورات ساده و پرکاربرد لینوکس آشنا خواهیم شد.
|
||||||
|
|
||||||
|
## اهداف فصل
|
||||||
|
- آشنایی با مفهوم دایرکتوری (Directory) و دستورات `pwd` و `cd`
|
||||||
|
- آشنایی با دستور `ls` و آپشنهای مختلف آن
|
||||||
|
- یادگیری نکات تکمیلی در رابطه با کار با ترمینال
|
||||||
|
- آشنایی با دستورات `mkdir` و `rmdir` و کاربرد آنها
|
||||||
|
- آشنایی با دستورات `touch` و `cat` برای ساخت فایل در لینوکس
|
||||||
|
- آشنایی با دستورات `cp`، `mv` و `rm`
|
||||||
|
- یادگیری نحوه آشنایی با دستورات لینوکس و یادگیری عمیق هر دستور
|
||||||
|
- آشنایی با دستورات `date` و `cal` برای نمایش تاریخ و زمان در لینوکس
|
||||||
|
- آشنایی با استاندارد استریمها در لینوکس و انواع آن
|
||||||
|
- آشنایی با پایپلاینها در لینوکس
|
||||||
|
|
||||||
|
فراموش نکنید که پس از اتمام این فصل و برای مرور مطالب حتما به چیتشیت دوره سر بزنید و مطالب را برای تثبیت، باری دیگر مرور کنید.
|
||||||
|
|
||||||
|
## مسیر مطالعه
|
||||||
|
- [درسنامه ۱: دستورات `pwd` و `cd`](lesson1.md)
|
||||||
|
- [درسنامه ۲: ساختار کلی دستورات در لینوکس](lesson2.md)
|
||||||
|
- [درسنامه ۳: دستور `ls`](lesson3.md)
|
||||||
|
- [تمرین ۱: دیدن سخت](exercise1.md)
|
||||||
|
- [تمرین ۲: بازی بازی](exercise2.md)
|
||||||
|
- [تمرین ۳: دفترچه تیمی](exercise3.md)
|
||||||
|
- [تمرین ۴: بایگانی پروژه](exercise4.md)
|
||||||
|
- [تمرین ۵: شکار گزینهٔ درست](exercise5.md)
|
||||||
|
- [تمرین ۶: تقویم تیم پشتیبان](exercise6.md)
|
||||||
|
- [تمرین ۷: پایپلاین خطاگیر](exercise7.md)
|
||||||
|
- [تمرین ۸: یادداشتِ مریخی](exercise8.md)
|
||||||
|
- [تمرین ۹: مرکز پشتیبانی و cat](exercise9.md)
|
||||||
|
- [تمرین ۱۰: ادغامگرِ گزارشها](exercise10.md)
|
||||||
|
- [درسنامه ۴: مدیریت تاریخچه و صفحهٔ ترمینال](lesson4.md)
|
||||||
|
- [درسنامه ۵: ساخت و حذف دایرکتوریها](lesson5.md)
|
||||||
|
- [درسنامه ۶: ساخت فایل و نمایش محتوا با `touch` و `cat`](lesson6.md)
|
||||||
|
- [درسنامه ۷: مدیریت فایلها با `cp`، `mv` و `rm`](lesson7.md)
|
||||||
|
- [درسنامه ۸: مستندات دستورات و یادگیری عمیق در لینوکس](lesson8.md)
|
||||||
|
- [درسنامه ۹: مدیریت تاریخ و تقویم با `date` و `cal`](lesson9.md)
|
||||||
|
- [درسنامه ۱۰: استاندارد استریمها در لینوکس](lesson10.md)
|
||||||
|
- [درسنامه ۱۱: ساخت پایپلاین در خط فرمان لینوکس](lesson11.md)
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
# فصل دو: مدیریت فایلها و کار با رشتهها
|
||||||
|
|
||||||
|
در این فصل با نحوهٔ مدیریت فایلها و کار با رشتهها در لینوکس و برخی دستورات مقدماتی آنها آشنا میشویم. مطالب با مثالهای ساده و قابل اجرا برای دانشجویان مبتدی تنظیم شدهاند.
|
||||||
|
|
||||||
|
## اهداف فصل
|
||||||
|
- آشنایی با دستورات `file` و `du` برای نمایش جزئیات و اطلاعات فایلها
|
||||||
|
- آشنایی با ادیتورهای پیشفرض لینوکس (مانند `nano` و `vim`)
|
||||||
|
- معرفی دایرکتوریهای مهم لینوکس و ساختار فایلبندی
|
||||||
|
- مشاهدهٔ راحتتر محتویات فایلها با `more`, `less`, `head`, `tail`
|
||||||
|
- برش بخشی از محتوا با `cut`
|
||||||
|
- مرتبسازی و شمارش با `sort` و `wc`
|
||||||
|
- جستوجو در متن با `grep`
|
||||||
|
- جستوجوی فایلها با `find` و آپشنهای مهم
|
||||||
|
- معرفی وایلدکاردها (Wildcards) و کاربرد آنها
|
||||||
|
- روشهای رایج فشردهسازی فایلها (`tar`, `gzip`, `zip` و ...)
|
||||||
|
- مقدمهای بر `awk`
|
||||||
|
|
||||||
|
فراموش نکنید که پس از اتمام این فصل و برای مرور مطالبی که تاکنون آموختهاید حتما به چیتشیت دوره سر بزنید و مطالب را برای تثبیت، باری دیگر مرور کنید.
|
||||||
@@ -0,0 +1,17 @@
|
|||||||
|
# فصل سه: شروع برنامهنویسی Bash
|
||||||
|
|
||||||
|
در دو فصل قبل با محیط خط فرمان، ساختار کلی دستورات و کار با دایرکتوریها آشنا شدیم. از این فصل کمکم وارد دنیای «برنامهنویسی با Bash» میشویم؛ یعنی به جای اجرای چند دستور جدا از هم، دستوراتمان را در یک فایل متنی مینویسیم تا مثل یک برنامهٔ کوچک روی لینوکس اجرا شود.
|
||||||
|
|
||||||
|
هدف این فصل این است که بدون وارد شدن به جزئیات پیچیده، شما را با مفهوم اسکریپت، نحوهٔ ساخت آن، متغیرها، گرفتن ورودی از کاربر، استفاده از شرطها، آشنایی اولیه با حلقهها و در نهایت دادن مجوز اجرا و اجرای اسکریپت آشنا کند.
|
||||||
|
|
||||||
|
## اهداف فصل
|
||||||
|
- آشنایی با مفهوم شل و اسکریپتهای Bash و کاربرد آنها
|
||||||
|
- یادگیری ساخت یک اسکریپت ساده و ساختار پایهٔ آن (شبانگ، دستورهای ابتدایی، ذخیرهٔ فایل)
|
||||||
|
- شناخت متغیرها در Bash و نحوهٔ استفاده از آنها در اسکریپتهای ساده
|
||||||
|
- یادگیری گرفتن ورودی از کاربر با استفاده از `read` و آشنایی اولیه با آرگومانهای خط فرمان
|
||||||
|
- آشنایی با شرطها (`if`) برای تصمیمگیری در اسکریپت و ساخت برنامههای تعاملی ساده
|
||||||
|
- آشنایی اولیه با حلقهها (`for` و `while`) برای تکرار دستورات و پردازش چندبارهٔ دادهها
|
||||||
|
- آشنایی مقدماتی با ساخت منوهای متنی ساده و توابع برای مرتبسازی و خواناتر شدن اسکریپتها
|
||||||
|
- یادگیری دادن دسترسی اجرایی به فایل با `chmod` و اجرای اسکریپت به روشهای مختلف (`bash script.sh` و `./script.sh`)
|
||||||
|
|
||||||
|
فراموش نکنید که پس از اتمام این فصل و برای مرور مطالب حتما به چیتشیت دوره سر بزنید و مفاهیم جدید را یکبار دیگر بهصورت فشرده مرور کنید.
|
||||||
+303
@@ -0,0 +1,303 @@
|
|||||||
|
# آزمونهای فصل ۳ — اسکریپتنویسی Bash
|
||||||
|
|
||||||
|
در این فایل دو آزمون چهارگزینهای ۱۰ سؤالی برای فصل ۳ (و کمی از مباحث انتهای فصل ۲) آورده شده است. سطح سؤالات متوسط رو به بالا است.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## آزمون ۱ — Bash مقدماتی و منطق اسکریپت
|
||||||
|
|
||||||
|
**سؤال ۱)** هدف اصلی خط زیر در ابتدای اسکریپت Bash چیست؟
|
||||||
|
`#!/bin/bash`
|
||||||
|
الف) تبدیل اسکریپت به فایل باینری
|
||||||
|
ب) مشخصکردن مفسر (interpreter) برای اجرای اسکریپت
|
||||||
|
ج) دادن مجوز اجرایی به فایل
|
||||||
|
د) تغییر دایرکتوری فعلی هنگام اجرا
|
||||||
|
**پاسخ صحیح: ب**
|
||||||
|
|
||||||
|
**سؤال ۲)** کدام دستور تعریف متغیر در Bash از نظر نگارش درست است؟
|
||||||
|
الف) `USER NAME="student"`
|
||||||
|
ب) `USER_NAME = "student"`
|
||||||
|
ج) `USER_NAME="student"`
|
||||||
|
د) `USER_NAME: "student"`
|
||||||
|
**پاسخ صحیح: ج**
|
||||||
|
|
||||||
|
**سؤال ۳)** در اسکریپت زیر چه اتفاقی میافتد؟
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
read -p "Name: " NAME
|
||||||
|
echo "Hello $NAME!"
|
||||||
|
```
|
||||||
|
الف) بدون نمایش چیزی از کاربر ورودی میگیرد
|
||||||
|
ب) فقط متن `"Name: "` را چاپ میکند و تمام میشود
|
||||||
|
ج) یک نام از کاربر میگیرد و سپس او را با آن نام سلام میکند
|
||||||
|
د) همیشه `"Hello $NAME!"` را بدون گرفتن ورودی چاپ میکند
|
||||||
|
**پاسخ صحیح: ج**
|
||||||
|
|
||||||
|
**سؤال ۴)** در یک اسکریپت Bash، متغیر `$1` معمولاً چه چیزی را نگه میدارد؟
|
||||||
|
الف) نام اسکریپت
|
||||||
|
ب) تعداد آرگومانهای خط فرمان
|
||||||
|
ج) اولین آرگومان خط فرمان هنگام اجرای اسکریپت
|
||||||
|
د) خط جاری در حال اجرا در اسکریپت
|
||||||
|
**پاسخ صحیح: ج**
|
||||||
|
|
||||||
|
**سؤال ۵)** اسکریپت زیر چه زمانی پیام خطا را چاپ میکند؟
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
AGE="$1"
|
||||||
|
if [ "$AGE" -gt 18 ]; then
|
||||||
|
echo "Adult"
|
||||||
|
elif [ "$AGE" -eq 18 ]; then
|
||||||
|
echo "Exactly 18"
|
||||||
|
else
|
||||||
|
echo "Minor"
|
||||||
|
fi
|
||||||
|
```
|
||||||
|
اگر این اسکریپت با دستور `bash script.sh 18` اجرا شود، خروجی چیست؟
|
||||||
|
الف) `Adult`
|
||||||
|
ب) `Exactly 18`
|
||||||
|
ج) `Minor`
|
||||||
|
د) هیچچیز چاپ نمیشود
|
||||||
|
**پاسخ صحیح: ب**
|
||||||
|
|
||||||
|
**سؤال ۶)** فرض کنید اسکریپت زیر را داریم:
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
if [ "$1" = "start" ] || [ "$1" = "stop" ]; then
|
||||||
|
echo "OK"
|
||||||
|
else
|
||||||
|
echo "Invalid"
|
||||||
|
fi
|
||||||
|
```
|
||||||
|
کدام یک از دستورات زیر خروجی `Invalid` تولید میکند؟
|
||||||
|
الف) `bash script.sh start`
|
||||||
|
ب) `bash script.sh stop`
|
||||||
|
ج) `bash script.sh START`
|
||||||
|
د) `bash script.sh start stop`
|
||||||
|
**پاسخ صحیح: ج**
|
||||||
|
|
||||||
|
**سؤال ۷)** خروجی اسکریپت زیر چیست؟
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
for N in 1 2 3
|
||||||
|
do
|
||||||
|
if [ "$N" -eq 2 ]; then
|
||||||
|
continue
|
||||||
|
fi
|
||||||
|
echo "N=$N"
|
||||||
|
done
|
||||||
|
```
|
||||||
|
الف)
|
||||||
|
`N=1`
|
||||||
|
|
||||||
|
ب)
|
||||||
|
`N=2`
|
||||||
|
`N=3`
|
||||||
|
|
||||||
|
ج)
|
||||||
|
`N=1`
|
||||||
|
`N=3`
|
||||||
|
|
||||||
|
د)
|
||||||
|
`N=1`
|
||||||
|
`N=2`
|
||||||
|
`N=3`
|
||||||
|
**پاسخ صحیح: ج**
|
||||||
|
|
||||||
|
**سؤال ۸)** اسکریپت زیر چند خط روی صفحه چاپ میکند؟ (بدون درنظر گرفتن خط فرمان `read`)
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
COUNT=1
|
||||||
|
while [ "$COUNT" -le 3 ]
|
||||||
|
do
|
||||||
|
echo "Loop $COUNT"
|
||||||
|
COUNT=$((COUNT + 1))
|
||||||
|
done
|
||||||
|
```
|
||||||
|
الف) هیچ خطی
|
||||||
|
ب) ۲ خط
|
||||||
|
ج) ۳ خط
|
||||||
|
د) ۴ خط
|
||||||
|
**پاسخ صحیح: ج**
|
||||||
|
|
||||||
|
**سؤال ۹)** کدام الگوی وایلدکارد فقط فایلهایی مثل `file_01.txt` و `file_12.txt` را میگیرد و *فایل `file_100.txt`* را شامل نمیشود؟
|
||||||
|
الف) `file_*.txt`
|
||||||
|
ب) `file_?.txt`
|
||||||
|
ج) `file_??.txt`
|
||||||
|
د) `file_[0-9]*.txt`
|
||||||
|
**پاسخ صحیح: ج**
|
||||||
|
|
||||||
|
**سؤال ۱۰)** دستور زیر چه کاری انجام میدهد؟
|
||||||
|
```bash
|
||||||
|
tar -czf backup.tar.gz mydir/
|
||||||
|
```
|
||||||
|
الف) فایل `backup.tar.gz` را استخراج میکند
|
||||||
|
ب) پوشهٔ `mydir/` را فشرده و در `backup.tar.gz` آرشیو میکند
|
||||||
|
ج) فقط ساختار دایرکتوری `mydir/` را بدون فایلها ذخیره میکند
|
||||||
|
د) محتویات `backup.tar.gz` را روی `mydir/` بازنویسی میکند
|
||||||
|
**پاسخ صحیح: ب**
|
||||||
|
|
||||||
|
### پاسخنامه آزمون ۱
|
||||||
|
- ۱) ب
|
||||||
|
- ۲) ج
|
||||||
|
- ۳) ج
|
||||||
|
- ۴) ج
|
||||||
|
- ۵) ب
|
||||||
|
- ۶) ج
|
||||||
|
- ۷) ج
|
||||||
|
- ۸) ج
|
||||||
|
- ۹) ج
|
||||||
|
- ۱۰) ب
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## آزمون ۲ — حلقهها، case، توابع، وایلدکارد، فشردهسازی و awk
|
||||||
|
|
||||||
|
**سؤال ۱)** الگوی زیر در شل کدام نوع فایلها را انتخاب میکند؟
|
||||||
|
`*.[ch]`
|
||||||
|
الف) همهٔ فایلهایی که نامشان فقط یک کاراکتر است
|
||||||
|
ب) همهٔ فایلهایی که پسوندشان `c.` یا `h.` است
|
||||||
|
ج) همهٔ فایلهایی که پسوندشان `c` یا `h` است (مثل `main.c`, `util.h`)
|
||||||
|
د) هیچ فایلی، چون الگو نادرست است
|
||||||
|
**پاسخ صحیح: ج**
|
||||||
|
|
||||||
|
**سؤال ۲)** امنترین روال برای حذف فایلهای موقت با الگوی `*.tmp` کدام است؟
|
||||||
|
الف) مستقیم: `rm *.tmp`
|
||||||
|
ب) `rm -f *.tmp`
|
||||||
|
ج) اول `ls *.tmp` برای بررسی، سپس `rm -i *.tmp` برای حذف تعاملی
|
||||||
|
د) `rm -rf / *.tmp`
|
||||||
|
**پاسخ صحیح: ج**
|
||||||
|
|
||||||
|
**سؤال ۳)** دستور زیر چه کاری میکند؟
|
||||||
|
```bash
|
||||||
|
tar -tzf backup.tar.gz
|
||||||
|
```
|
||||||
|
الف) آرشیو را فشرده میکند
|
||||||
|
ب) آرشیو را استخراج میکند
|
||||||
|
ج) محتویات آرشیو را *بدون استخراج* فهرست میکند
|
||||||
|
د) آرشیو را حذف میکند
|
||||||
|
**پاسخ صحیح: ج**
|
||||||
|
|
||||||
|
**سؤال ۴)** کدام گزینه، یک آرشیو zip تکرارشونده از پوشهٔ `project/` میسازد؟
|
||||||
|
الف) `zip project project/`
|
||||||
|
ب) `zip -r project.zip project/`
|
||||||
|
ج) `tar -czf project.zip project/`
|
||||||
|
د) `zip -x project.zip project/`
|
||||||
|
**پاسخ صحیح: ب**
|
||||||
|
|
||||||
|
**سؤال ۵)** کدام دستور awk ستون اول و سوم یک فایل CSV را که با کاما جدا شده چاپ میکند؟
|
||||||
|
الف) `awk '{print $1, $3}' data.csv`
|
||||||
|
ب) `awk -F, '{print $1, $3}' data.csv`
|
||||||
|
ج) `awk -F, '{print $0}' data.csv`
|
||||||
|
د) `awk -F: '{print $1, $3}' data.csv`
|
||||||
|
**پاسخ صحیح: ب**
|
||||||
|
|
||||||
|
**سؤال ۶)** برای محاسبهٔ مجموع اعداد ستون دوم در فایل `prices.txt` با awk کدام دستور مناسب است؟
|
||||||
|
الف) `awk '{print $2}' prices.txt`
|
||||||
|
ب) `awk '{sum += $2} END {print sum}' prices.txt`
|
||||||
|
ج) `awk -F, '{sum += $1} END {print sum}' prices.txt`
|
||||||
|
د) `awk 'END {print $2}' prices.txt`
|
||||||
|
**پاسخ صحیح: ب**
|
||||||
|
|
||||||
|
**سؤال ۷)** اسکریپت زیر را در نظر بگیرید:
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
read -p "Mode (start/stop): " MODE
|
||||||
|
case "$MODE" in
|
||||||
|
start)
|
||||||
|
echo "Starting..."
|
||||||
|
;;
|
||||||
|
stop)
|
||||||
|
echo "Stopping..."
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Unknown mode"
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
```
|
||||||
|
اگر کاربر مقدار `START` (با حروف بزرگ) را وارد کند، خروجی چیست؟
|
||||||
|
الف) `Starting...`
|
||||||
|
ب) `Stopping...`
|
||||||
|
ج) `Unknown mode`
|
||||||
|
د) هیچچیز چاپ نمیشود
|
||||||
|
**پاسخ صحیح: ج**
|
||||||
|
|
||||||
|
**سؤال ۸)** در اسکریپت زیر خروجی چیست؟
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
count=0
|
||||||
|
inc() {
|
||||||
|
count=$((count + 1))
|
||||||
|
}
|
||||||
|
inc
|
||||||
|
inc
|
||||||
|
echo "$count"
|
||||||
|
```
|
||||||
|
الف) هیچ خروجیای تولید نمیشود
|
||||||
|
ب) `1`
|
||||||
|
ج) `2`
|
||||||
|
د) خطای نحوی رخ میدهد
|
||||||
|
**پاسخ صحیح: ج**
|
||||||
|
|
||||||
|
**سؤال ۹)** خروجی اسکریپت زیر چیست؟
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
for N in 1 2 3 4
|
||||||
|
do
|
||||||
|
if [ "$N" -gt 2 ]; then
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
echo "$N"
|
||||||
|
done
|
||||||
|
```
|
||||||
|
الف)
|
||||||
|
فقط `1`
|
||||||
|
|
||||||
|
ب)
|
||||||
|
`1`
|
||||||
|
`2`
|
||||||
|
|
||||||
|
ج)
|
||||||
|
`1`
|
||||||
|
`2`
|
||||||
|
`3`
|
||||||
|
|
||||||
|
د) هیچچیز چاپ نمیشود
|
||||||
|
**پاسخ صحیح: ب**
|
||||||
|
|
||||||
|
**سؤال ۱۰)** اسکریپت زیر را در نظر بگیرید:
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
for ARG in "$@"
|
||||||
|
do
|
||||||
|
echo "[$ARG]"
|
||||||
|
done
|
||||||
|
```
|
||||||
|
اگر این اسکریپت با دستور زیر اجرا شود:
|
||||||
|
`bash script.sh "A B" C`
|
||||||
|
خروجی چیست؟
|
||||||
|
الف)
|
||||||
|
`[A]`
|
||||||
|
`[B]`
|
||||||
|
`[C]`
|
||||||
|
|
||||||
|
ب)
|
||||||
|
`[A B C]`
|
||||||
|
|
||||||
|
ج)
|
||||||
|
`[A B]`
|
||||||
|
`[C]`
|
||||||
|
|
||||||
|
د) هیچچیز چاپ نمیشود
|
||||||
|
**پاسخ صحیح: ج**
|
||||||
|
|
||||||
|
### پاسخنامه آزمون ۲
|
||||||
|
- ۱) ج
|
||||||
|
- ۲) ج
|
||||||
|
- ۳) ج
|
||||||
|
- ۴) ب
|
||||||
|
- ۵) ب
|
||||||
|
- ۶) ب
|
||||||
|
- ۷) ج
|
||||||
|
- ۸) ج
|
||||||
|
- ۹) ب
|
||||||
|
- ۱۰) ج
|
||||||
@@ -0,0 +1,57 @@
|
|||||||
|
# تمرین ۱: دیدن سخت
|
||||||
|
|
||||||
|
## صورت سوال
|
||||||
|
سلیب، کاربر تازهکار لینوکس، میخواهد مهارتهایش در آدرسدهی نسبی و کار با دستور `ls` را تقویت کند. او از شما خواسته است تنها سه دستور `ls` بنویسید تا با اجرا در سه موقعیت متفاوت، نیازش برطرف شود. دقت کنید که:
|
||||||
|
|
||||||
|
- پوشهٔ `khorasan` از قبل برای هر کاربر در مسیر خانگی قرار دارد: `/home/<USERNAME>/khorasan`.
|
||||||
|
- برای اجرای هر مرحله کافی است ابتدا با دستور مناسب (مانند `cd`) وارد مسیر گفتهشده شوید و سپس تنها دستور `ls` مورد نیاز همان مرحله را اجرا کنید. در پاسخ نهایی باید فقط سه خط دستور `ls` بنویسید.
|
||||||
|
- هدف او دریافت خروجی «لیست طولانی» مرتب بر اساس زمان آخرین تغییر با نمایش اندازههای قابلخواندن است.
|
||||||
|
|
||||||
|
ساختار پوشهٔ `khorasan` به شکل زیر است:
|
||||||
|
|
||||||
|
```
|
||||||
|
khorasan
|
||||||
|
├── alireza
|
||||||
|
│ ├── final
|
||||||
|
│ │ └── final-code
|
||||||
|
│ └── sub
|
||||||
|
│ ├── 1.sh
|
||||||
|
│ ├── 2.py
|
||||||
|
│ ├── 3.py
|
||||||
|
│ ├── 4.sh
|
||||||
|
│ ├── 5.sh
|
||||||
|
│ └── 6.py
|
||||||
|
├── arshia
|
||||||
|
│ ├── final
|
||||||
|
│ │ └── final-code
|
||||||
|
│ └── sub
|
||||||
|
│ ├── 1.sh
|
||||||
|
│ ├── 2.sh
|
||||||
|
│ ├── 3.sh
|
||||||
|
│ ├── 4.sh
|
||||||
|
│ ├── 5.sh
|
||||||
|
│ ├── 6.sh
|
||||||
|
│ └── 7.sh
|
||||||
|
└── salib
|
||||||
|
├── final
|
||||||
|
│ └── final-code
|
||||||
|
└── sub
|
||||||
|
├── 1.py
|
||||||
|
├── 2.py
|
||||||
|
├── 3.py
|
||||||
|
├── 4.py
|
||||||
|
└── 5.py
|
||||||
|
```
|
||||||
|
|
||||||
|
او از شما تنها و تنها سه دستور `ls` به همراه آپشنهای مورد نظر میخواهد.
|
||||||
|
|
||||||
|
کار سلیب سه مرحله دارد:
|
||||||
|
|
||||||
|
1. ابتدا وارد دایرکتوری `khorasan` شوید و پس از قرار گرفتن در آن، محتویات همین دایرکتوری را به صورت لیستی دقیق، مرتبشده بر اساس زمان آخرین تغییرات و با حجمهای خوانا برای انسان (مانند `4K`, `8M` و ...) نمایش دهید.
|
||||||
|
|
||||||
|
2. مرحلهٔ بعد وارد دایرکتوری `khorasan/salib` شوید و بدون ترک این مسیر، محتویات دایرکتوری `alireza` را با همان شرایط (لیست دقیق، مرتب بر اساس زمان و اندازهٔ خوانا) مشاهده کنید.
|
||||||
|
|
||||||
|
3. در نهایت وارد دایرکتوری `khorasan/salib/sub` شوید و از همانجا محتویات دایرکتوری `khorasan/arshia/sub` را با شرایط گفتهشده فهرست کنید، بدون آنکه مسیر فعلی را تغییر دهید.
|
||||||
|
|
||||||
|
## راهنمایی
|
||||||
|
- نوشتن مسیرهای نسبی را با استفاده از `..` تمرین کنید تا بتوانید از موقعیت فعلی به مقصد برسید.
|
||||||
@@ -0,0 +1,59 @@
|
|||||||
|
# تمرین ۱۰: ادغامگرِ گزارشها (شبیه `cat` با `>` و `>>`)
|
||||||
|
|
||||||
|
## صورت سؤال
|
||||||
|
یک ابزار ساده دارید که با منطق دستور `cat` و تغییر مسیر (`>` و `>>`) گزارشها را میسازد. شما باید خروجی نهایی فایل `final.txt` را بعد از اجرای دستورها به دست آورید.
|
||||||
|
|
||||||
|
دستورهای ممکن:
|
||||||
|
|
||||||
|
- `touch f` اگر فایل `f` وجود نداشته باشد آن را خالی میسازد؛ اگر وجود داشته باشد، محتوا تغییر نمیکند.
|
||||||
|
- `write f s` محتوای فایل `f` را دقیقاً برابر یک خط `s` قرار میدهد (بازنویسی کامل).
|
||||||
|
- `append f s` یک خط `s` را به انتهای فایل `f` اضافه میکند.
|
||||||
|
- `merge a b > c` محتوای فعلی فایل `a` سپس محتوای فعلی فایل `b` را پشت سر هم در نظر بگیرید و نتیجه را **کامل روی** فایل `c` بنویسید (بازنویسی کامل).
|
||||||
|
- `merge a b >> c` همان ادغام است، با این تفاوت که نتیجه باید **به انتهای** فایل `c` اضافه شود.
|
||||||
|
|
||||||
|
نکته: اگر فایلهای `a` یا `b` وجود نداشتند، در عملیات `merge` به عنوان فایل خالی در نظر بگیرید.
|
||||||
|
|
||||||
|
در پایان، اگر `final.txt` وجود نداشت یا خالی بود باید دقیقاً `EMPTY` چاپ شود.
|
||||||
|
|
||||||
|
## ورودی
|
||||||
|
در خط اول عدد `q` تعداد دستورها آمده است.
|
||||||
|
در `q` خط بعدی، هر خط یکی از دستورهای بالا است.
|
||||||
|
|
||||||
|
نام فایلها فقط شامل حروف انگلیسی، عدد، `_` و `.` است.
|
||||||
|
`s` یک متن یکخطی است که میتواند شامل فاصله باشد و تا انتهای خط ادامه دارد.
|
||||||
|
|
||||||
|
## خروجی
|
||||||
|
محتوای نهایی `final.txt` را چاپ کنید (هر خط جداگانه).
|
||||||
|
اگر فایل وجود نداشت یا خالی بود، فقط `EMPTY` چاپ کنید.
|
||||||
|
|
||||||
|
## محدودیتها
|
||||||
|
- `1 ≤ q ≤ 2×10^4`
|
||||||
|
- طول `s` حداکثر 100 کاراکتر است.
|
||||||
|
|
||||||
|
## نمونه
|
||||||
|
**ورودی نمونه**
|
||||||
|
```text
|
||||||
|
10
|
||||||
|
write a.txt A1
|
||||||
|
append a.txt A2
|
||||||
|
write b.txt B1
|
||||||
|
touch final.txt
|
||||||
|
merge a.txt b.txt > final.txt
|
||||||
|
append b.txt B2
|
||||||
|
merge a.txt b.txt >> final.txt
|
||||||
|
touch a.txt
|
||||||
|
write a.txt NEW
|
||||||
|
merge a.txt missing.txt >> final.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
**خروجی نمونه**
|
||||||
|
```text
|
||||||
|
A1
|
||||||
|
A2
|
||||||
|
B1
|
||||||
|
A1
|
||||||
|
A2
|
||||||
|
B1
|
||||||
|
B2
|
||||||
|
NEW
|
||||||
|
```
|
||||||
@@ -0,0 +1,34 @@
|
|||||||
|
# تمرین ۲: بازی بازی
|
||||||
|
|
||||||
|
## صورت سوال
|
||||||
|
ساختار فایلهای عجیب زیر در اختیار شماست و باید آن را اصلاح کنید. در ابتدا دایرکتوری خانگیتان شامل ساختار درختی زیر است:
|
||||||
|
|
||||||
|
```
|
||||||
|
bazi-bazi
|
||||||
|
└── arshia
|
||||||
|
└── tmp
|
||||||
|
```
|
||||||
|
|
||||||
|
- دایرکتوری `bazi-bazi` شامل پوشهای به نام `arshia` است و داخل آن نیز دایرکتوری `tmp` قرار دارد.
|
||||||
|
- ابتدا باید پوشهٔ `arshia` و تمام محتوایش را حذف کنید.
|
||||||
|
- سپس داخل `bazi-bazi` پوشهای به نام `ali` بسازید و درون آن دایرکتوری دیگری با نام `reza` ایجاد کنید.
|
||||||
|
- در پایان باید زنجیرهٔ پوشههای `s/a/l/i/b` را زیر `bazi-bazi` بسازید (هر حرف یک پوشهٔ داخل پوشهٔ قبلی).
|
||||||
|
|
||||||
|
## هدف نهایی
|
||||||
|
پس از انجام مراحل، ساختار باید به شکل زیر باشد:
|
||||||
|
|
||||||
|
```
|
||||||
|
bazi-bazi
|
||||||
|
├── ali
|
||||||
|
│ └── reza
|
||||||
|
└── s
|
||||||
|
└── a
|
||||||
|
└── l
|
||||||
|
└── i
|
||||||
|
└── b
|
||||||
|
```
|
||||||
|
|
||||||
|
## نکات
|
||||||
|
- میتوانید از تمام دستورات آموختهشده مانند `rm`, `rmdir`, `mkdir`, `cd` و غیره استفاده کنید.
|
||||||
|
- اگر نیاز داشتید، مسیر کاری خود را با `cd` تغییر دهید تا مدیریت پوشهها راحتتر شود.
|
||||||
|
- پس از اتمام کار، نتیجهٔ نهایی را بررسی کنید و برای اطمینان از ساختار درست، از ابزارهایی مثل `tree` یا `ls` کمک بگیرید.
|
||||||
@@ -0,0 +1,37 @@
|
|||||||
|
# تمرین ۳: دفترچه تیمی
|
||||||
|
|
||||||
|
## صورت سؤال
|
||||||
|
تیم شما تصمیم دارد دفترچهٔ یادداشت مشترکی بسازد که شامل چند فایل متنی ساده باشد. ساختار دایرکتوری مورد نیاز در مسیر خانگی به شکل زیر تعریف شده است:
|
||||||
|
|
||||||
|
```
|
||||||
|
~/notebook
|
||||||
|
├── daily
|
||||||
|
└── ideas
|
||||||
|
```
|
||||||
|
|
||||||
|
وظایف شما:
|
||||||
|
|
||||||
|
1. در دایرکتوری `daily` فایلهایی برای سه روز متوالی (مثل `day-01.txt`, `day-02.txt`, `day-03.txt`) بسازید؛ این فایلها باید در ابتدا خالی باشند.
|
||||||
|
2. در دایرکتوری `ideas` فایل `brainstorm.txt` را ایجاد کنید و بلافاصله سه خط ایده در آن بنویسید؛ هر ایده در یک خط مجزا.
|
||||||
|
3. با استفاده از `cat` محتوای `brainstorm.txt` را به انتهای فایل دیگری به نام `all-ideas.txt` اضافه کنید تا کل ایدهها در یک فایل جمعآوری شوند.
|
||||||
|
4. برای تأیید کار، دستور مناسبی اجرا کنید تا خروجی زیر را روی صفحه ببینید:
|
||||||
|
- تعداد خطوط `all-ideas.txt`
|
||||||
|
- محتوای فایل برای بررسی بصری
|
||||||
|
|
||||||
|
در پایان باید ساختار زیر را داشته باشید:
|
||||||
|
|
||||||
|
```
|
||||||
|
~/notebook
|
||||||
|
├── daily
|
||||||
|
│ ├── day-01.txt
|
||||||
|
│ ├── day-02.txt
|
||||||
|
│ └── day-03.txt
|
||||||
|
└── ideas
|
||||||
|
├── all-ideas.txt
|
||||||
|
└── brainstorm.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
## نکات
|
||||||
|
- برای ساخت فایلهای خالی از `touch` استفاده کنید.
|
||||||
|
- جهت نوشتن متن، میتوانید از `cat > FILE` کمک بگیرید و با `Ctrl + D` نوشتن را به پایان برسانید.
|
||||||
|
- ترکیب `cat FILE >> OTHER_FILE` اجازه میدهد محتوا به انتهای فایل دیگری افزوده شود.
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
# تمرین ۴: بایگانی پروژه
|
||||||
|
|
||||||
|
## صورت سؤال
|
||||||
|
یک پروژهٔ کوچک در دایرکتوری `~/mini-project` دارید که شامل فایلهای زیر است:
|
||||||
|
|
||||||
|
```
|
||||||
|
mini-project
|
||||||
|
├── README.md
|
||||||
|
├── src
|
||||||
|
│ ├── app.py
|
||||||
|
│ ├── config.yml
|
||||||
|
│ └── templates
|
||||||
|
│ └── base.html
|
||||||
|
└── tmp
|
||||||
|
├── draft.txt
|
||||||
|
└── old.log
|
||||||
|
```
|
||||||
|
|
||||||
|
وظایف شما:
|
||||||
|
|
||||||
|
1. نسخهٔ پشتیبان کامل پوشهٔ `src` را در مسیری به نام `backup/src-copy` ایجاد کنید بهگونهای که ساختار دایرکتوری حفظ شود.
|
||||||
|
2. فایل `draft.txt` را به نام `notes.txt` تغییر دهید و آن را به ریشهٔ پروژه (`mini-project`) منتقل کنید.
|
||||||
|
3. فایل `old.log` را حذف کنید.
|
||||||
|
4. پس از انجام تغییرات، فایلهای باقیمانده در `tmp` را بررسی کنید تا مطمئن شوید پوشهٔ مذکور خالی شده است. در صورت خالی بودن، آن را حذف کنید.
|
||||||
|
5. در نهایت ساختار پروژه باید به شکل زیر باشد:
|
||||||
|
|
||||||
|
```
|
||||||
|
mini-project
|
||||||
|
├── README.md
|
||||||
|
├── notes.txt
|
||||||
|
├── src
|
||||||
|
│ ├── app.py
|
||||||
|
│ ├── config.yml
|
||||||
|
│ └── templates
|
||||||
|
│ └── base.html
|
||||||
|
└── backup
|
||||||
|
└── src-copy
|
||||||
|
├── app.py
|
||||||
|
├── config.yml
|
||||||
|
└── templates
|
||||||
|
└── base.html
|
||||||
|
```
|
||||||
|
|
||||||
|
## راهنمایی
|
||||||
|
- برای کپی بازگشتی از `cp -r` استفاده کنید.
|
||||||
|
- جهت جابهجایی و تغییر نام از `mv` کمک بگیرید.
|
||||||
|
- دستور `rm -i` قبل از حذف از شما تأیید میخواهد؛ برای فایلهای مطمئن میتوانید از `rm` ساده استفاده کنید.
|
||||||
|
- بررسی و حذف پوشهٔ خالی را با `rmdir` انجام دهید.
|
||||||
@@ -0,0 +1,16 @@
|
|||||||
|
# تمرین ۵: شکار گزینهٔ درست
|
||||||
|
|
||||||
|
## صورت سؤال
|
||||||
|
میخواهید اسکریپتی بنویسید که فایلهای بزرگتر از ۵ مگابایت را در یک دایرکتوری مشخص فهرست کند. قبل از نوشتن اسکریپت، لازم است روش دستی این کار را با استفاده از ابزارهای استاندارد لینوکس پیدا کنید.
|
||||||
|
|
||||||
|
وظایف شما:
|
||||||
|
|
||||||
|
1. با مطالعهٔ مستندات، گزینهای از دستور `find` را بیابید که اجازه دهد اندازهٔ فایل را بر حسب مگابایت مقایسه کنید. خروجی مستندات را بخوانید و یادداشت کنید که چگونه میتوان فایلهایی بزرگتر از مقدار خاصی را فیلتر کرد.
|
||||||
|
2. با اجرای `man find` بخش مربوط به گزینهٔ مورد نیاز را بررسی کرده و یک مثال عملی در ترمینال اجرا کنید تا فقط فایلهای بزرگتر از ۵ مگابایت در مسیر دلخواه (مثلاً `~/Downloads`) نمایش داده شوند.
|
||||||
|
3. از گزینهٔ مناسب `-exec` یا پایپ به `ls -lh` استفاده کنید تا خروجی قابلخواندنتری از اندازهٔ فایلها داشته باشید.
|
||||||
|
4. در پایان خلاصهای یک خطی از دستور نهایی که نوشتهاید، همراه با توضیح کوتاهی از اینکه هر بخش چه کاری انجام میدهد، آماده کنید.
|
||||||
|
|
||||||
|
## نکات
|
||||||
|
- اگر بخش مورد نظر در `man` طولانی است، در همان صفحه با `/<KEYWORD>` جستوجو کنید.
|
||||||
|
- برای آشنایی سریع با گزینهها میتوانید ابتدا `find --help` را اجرا کنید و سپس سراغ `man find` بروید تا جزئیات را به دست آورید.
|
||||||
|
- سایتهایی مثل TLDR Pages خلاصهٔ آماده دارند؛ اما در این تمرین تأکید بر یادگیری از منابع داخلی لینوکس است.
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
# تمرین ۶: تقویم تیم پشتیبان
|
||||||
|
|
||||||
|
## صورت سؤال
|
||||||
|
تیم پشتیبانی میخواهد برنامهٔ کاری سه ماه آینده را تنظیم کند. برای این کار لازم است اطلاعات زیر را از طریق خط فرمان استخراج کنید:
|
||||||
|
|
||||||
|
1. تاریخ و زمان فعلی سیستم را با قالب `YYYY-MM-DD HH:MM` به نمایش بگذارید و در یک فایل متنی با نام `support-schedule.txt` ذخیره کنید.
|
||||||
|
2. تقویم سه ماه آینده (ماه جاری و دو ماه بعد) را در همان فایل ثبت کنید به گونهای که بین هر ماه یک خط خالی قرار گیرد.
|
||||||
|
3. با استفاده از یک دستور تکخطی، شمارهٔ هفتههای ماه جاری را استخراج کنید و آنها را به انتهای فایل اضافه نمایید. (میتوانید از `grep`, `awk`, یا هر ابزار دیگری که ترجیح میدهید استفاده کنید.)
|
||||||
|
4. خروجی نهایی فایل باید شامل نمونهای مشابه زیر باشد:
|
||||||
|
|
||||||
|
```
|
||||||
|
2024-06-20 10:42
|
||||||
|
|
||||||
|
June 2024
|
||||||
|
Su Mo Tu We Th Fr Sa
|
||||||
|
...
|
||||||
|
|
||||||
|
July 2024
|
||||||
|
Su Mo Tu We Th Fr Sa
|
||||||
|
...
|
||||||
|
|
||||||
|
Current month weeks: 23 24 25 26 27
|
||||||
|
```
|
||||||
|
|
||||||
|
## نکات
|
||||||
|
- برای قالببندی `date` از رشتههای قالب با `+` استفاده کنید.
|
||||||
|
- چاپ چند ماه پشت سر هم با گزینهٔ `-A` یا اجرای چندبارهٔ `cal` قابل انجام است.
|
||||||
|
- جهت استخراج شمارهٔ هفتهها فرمان `ncal -w` یا ترکیبی از `cal` و ابزارهای متنی میتواند کمککننده باشد.
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
# تمرین ۷: پایپلاین خطاگیر
|
||||||
|
|
||||||
|
## صورت سؤال
|
||||||
|
در یک سیستم چند سرویس مختلف لاگهای خود را در دایرکتوری `~/logs` ذخیره میکنند. فایلهایی که با الگوی `service-*.log` نامگذاری شدهاند ممکن است پیامهای خطا داشته باشند. هدف شما ساخت یک پایپلاین است که اطلاعات زیر را استخراج کند:
|
||||||
|
|
||||||
|
1. همهٔ فایلهای مطابق الگو را بخوانید و فقط خطوطی که عبارت `ERROR` دارند فیلتر کنید.
|
||||||
|
2. تعداد کل پیامهای خطا را بشمارید و نتیجه را در فایلی به نام `error-count.txt` بنویسید.
|
||||||
|
3. همزمان باید همان خروجی فیلترشده روی صفحه نمایش داده شود تا بتوانید خطاها را مشاهده کنید.
|
||||||
|
4. برای اطمینان، پیامهای خطای فیلتر شده را نیز در فایلی به نام `errors-full.log` ذخیره کنید؛ درصورتی که فایل از قبل وجود داشته باشد باید به انتهای آن اضافه شود.
|
||||||
|
|
||||||
|
## شرایط
|
||||||
|
- فرض کنید ابزار `gzip` به صورت دورهای فایلها را فشرده میکند. لازم است پایپ شما فقط فایلهای متنی بدون فشردهسازی (پسوند `.log`) را پردازش کند.
|
||||||
|
- اگر دستور شما هنگام اجرا با خطایی مواجه شد، پیام خطا باید در فایلی با نام `pipeline-errors.log` ذخیره شود تا بعداً بررسی شود.
|
||||||
|
|
||||||
|
## راهنمایی
|
||||||
|
- برای جلوگیری از نمایش پیامهای خطا روی صفحه، از تغییر مسیر `2>` استفاده کنید.
|
||||||
|
- دستور `tee` میتواند خروجی را همزمان در فایل و ترمینال چاپ کند؛ برای افزودن به فایل از گزینهٔ `-a` استفاده کنید.
|
||||||
|
- ترکیب `cat`, `grep`, `wc -l`, `tee` و تغییر مسیر جریانها یک راهحل متداول برای چنین تمرینی است. هدف نهایی ساخت یک پایپلاین قابلاعتماد و قابلخواندن است.
|
||||||
@@ -0,0 +1,63 @@
|
|||||||
|
# تمرین ۸: یادداشتِ مریخی
|
||||||
|
|
||||||
|
## صورت سؤال
|
||||||
|
در یک آزمایشگاه فضایی، فقط یک فایل به نام `mars.txt` داریم و چند دستور بهترتیب اجرا میشود. شما باید **با یک اسکریپت Bash** این دستورها را از ورودی بخوانید و در پایان، محتوای نهایی فایل را چاپ کنید.
|
||||||
|
|
||||||
|
هدف تمرین این است که از چیزهایی که تا اینجا در فصل ۳ یاد گرفتهاید استفاده کنید: `read`، متغیرها، `if` و حلقهها (بهخصوص `while` یا `for`).
|
||||||
|
|
||||||
|
رفتار دستورها:
|
||||||
|
|
||||||
|
- `touch` اگر فایل وجود نداشته باشد، آن را ایجاد میکند و **خالی** است؛ اگر فایل از قبل وجود داشته باشد، **هیچ تغییری در محتوا ایجاد نمیشود**.
|
||||||
|
- `> s` محتوای فایل را **کامل بازنویسی** میکند و بعد از آن فایل دقیقاً فقط شامل همان یک خط `s` است. (اگر فایل وجود نداشته باشد، این دستور آن را ایجاد میکند.)
|
||||||
|
- `>> s` یک خط `s` را **به انتهای فایل اضافه** میکند. (اگر فایل وجود نداشته باشد، این دستور آن را ایجاد میکند و همان یک خط را داخلش میگذارد.)
|
||||||
|
|
||||||
|
هدف این است که بعد از اجرای همهٔ دستورها، محتوای نهایی `mars.txt` را چاپ کنید.
|
||||||
|
|
||||||
|
اگر در پایان فایل وجود نداشت یا خالی بود، باید دقیقاً `EMPTY` چاپ شود.
|
||||||
|
|
||||||
|
نکته: لازم نیست واقعاً روی سیستم فایل بسازید؛ میتوانید فقط «محتوا» را در یک متغیر نگه دارید و شبیهسازی کنید.
|
||||||
|
|
||||||
|
## ورودی
|
||||||
|
در خط اول عدد `q` تعداد دستورها آمده است.
|
||||||
|
در `q` خط بعدی، هر خط یکی از حالتهای زیر است:
|
||||||
|
|
||||||
|
- `touch`
|
||||||
|
- `> s` (یک متن `s` که همان یک خط است)
|
||||||
|
- `>> s` (یک متن `s` که همان یک خط است)
|
||||||
|
|
||||||
|
`s` میتواند شامل فاصله باشد و تا انتهای خط ادامه دارد. (اما با فاصله شروع نمیشود.)
|
||||||
|
|
||||||
|
## خروجی
|
||||||
|
محتوای نهایی `mars.txt` را دقیقاً همانطور که هست چاپ کنید (هر خط جداگانه).
|
||||||
|
اگر فایل وجود نداشت یا خالی بود، فقط `EMPTY` چاپ کنید.
|
||||||
|
|
||||||
|
## محدودیتها
|
||||||
|
- `1 ≤ q ≤ 200`
|
||||||
|
- طول `s` حداقل 1 و حداکثر 100 کاراکتر است.
|
||||||
|
|
||||||
|
## راهنمایی (چند تریک کوچک)
|
||||||
|
- بهجای پارسکردن دستی، میتوانید هر خط را با `read -r OP TEXT` بخوانید؛ در این حالت `OP` یکی از `touch` یا `>` یا `>>` میشود و `TEXT` بقیهٔ خط خواهد بود (حتی اگر وسطش فاصله داشته باشد).
|
||||||
|
- با یک متغیر مثل `CONTENT` محتوای فایل را نگه دارید:
|
||||||
|
- برای `> s` کافی است `CONTENT` را برابر `s` کنید.
|
||||||
|
- برای `>> s` اگر `CONTENT` خالی نبود، اول یک خط جدید اضافه کنید و بعد `s` را بچسبانید.
|
||||||
|
- یک متغیر دیگر مثل `EXISTS` هم داشته باشید تا تشخیص دهید فایل اصلاً ساخته شده یا نه.
|
||||||
|
- حلقهٔ `while` با شمارنده (`i=$((i+1))`) یا یک حلقهٔ `for` میتواند `q` دستور را پردازش کند.
|
||||||
|
|
||||||
|
## نمونه
|
||||||
|
**ورودی نمونه**
|
||||||
|
```text
|
||||||
|
6
|
||||||
|
touch
|
||||||
|
> Hello Mars
|
||||||
|
>> Day 2
|
||||||
|
touch
|
||||||
|
>> Day 3
|
||||||
|
touch
|
||||||
|
```
|
||||||
|
|
||||||
|
**خروجی نمونه**
|
||||||
|
```text
|
||||||
|
Hello Mars
|
||||||
|
Day 2
|
||||||
|
Day 3
|
||||||
|
```
|
||||||
@@ -0,0 +1,56 @@
|
|||||||
|
# تمرین ۹: مرکز پشتیبانی و دستور `cat`
|
||||||
|
|
||||||
|
## صورت سؤال
|
||||||
|
یک تیم پشتیبانی برای هر پروژه یک فایل لاگ نگه میدارد و شما باید رفتار چند دستور ساده را شبیهسازی کنید.
|
||||||
|
|
||||||
|
دستورهای ممکن:
|
||||||
|
|
||||||
|
- `touch f` اگر فایل `f` وجود نداشته باشد آن را خالی میسازد؛ اگر وجود داشته باشد، محتوا تغییر نمیکند.
|
||||||
|
- `write f s` محتوای فایل `f` را دقیقاً برابر یک خط `s` قرار میدهد (بازنویسی کامل).
|
||||||
|
- `append f s` یک خط `s` را به انتهای فایل `f` اضافه میکند.
|
||||||
|
- `cat f` اگر فایل وجود نداشته باشد باید `ERROR` چاپ شود. اگر وجود داشته باشد ولی خالی باشد باید `EMPTY` چاپ شود. وگرنه باید کل محتوای فایل چاپ شود.
|
||||||
|
|
||||||
|
برای جدا کردن خروجیِ چند دستور `cat` از هم، بعد از خروجی هر `cat` (به جز آخری) یک خط شامل `###` چاپ کنید.
|
||||||
|
|
||||||
|
## ورودی
|
||||||
|
در خط اول عدد `q` تعداد دستورها آمده است.
|
||||||
|
در `q` خط بعدی، هر خط یکی از دستورهای بالا است.
|
||||||
|
|
||||||
|
نام فایلها (`f`) فقط شامل حروف انگلیسی، عدد، `_` و `.` است.
|
||||||
|
`s` یک متن یکخطی است که میتواند شامل فاصله باشد و تا انتهای خط ادامه دارد.
|
||||||
|
|
||||||
|
## خروجی
|
||||||
|
خروجی تمام دستورهای `cat` را طبق توضیحات چاپ کنید و بین خروجیها (به جز آخرین `cat`) یک خط `###` قرار دهید.
|
||||||
|
|
||||||
|
## محدودیتها
|
||||||
|
- `1 ≤ q ≤ 10^4`
|
||||||
|
- طول `s` حداکثر 100 کاراکتر است.
|
||||||
|
|
||||||
|
## نمونه
|
||||||
|
**ورودی نمونه**
|
||||||
|
```text
|
||||||
|
9
|
||||||
|
cat log.txt
|
||||||
|
touch log.txt
|
||||||
|
cat log.txt
|
||||||
|
append log.txt ticket1
|
||||||
|
append log.txt ticket2
|
||||||
|
cat log.txt
|
||||||
|
write log.txt reset
|
||||||
|
cat log.txt
|
||||||
|
cat missing.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
**خروجی نمونه**
|
||||||
|
```text
|
||||||
|
ERROR
|
||||||
|
###
|
||||||
|
EMPTY
|
||||||
|
###
|
||||||
|
ticket1
|
||||||
|
ticket2
|
||||||
|
###
|
||||||
|
reset
|
||||||
|
###
|
||||||
|
ERROR
|
||||||
|
```
|
||||||
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -0,0 +1,5 @@
|
|||||||
|
# دروس موسسه آموزش عالی خراسان
|
||||||
|
|
||||||
|
این صفحه برای آموزش درسهایی است که در حال حاضر در موسسه آموزش عالی خراسان تدریس میشوند.
|
||||||
|
|
||||||
|
برای مشاهده سرفصلها و محتوای هر درس، از منوی کناری استفاده کنید.
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
window.MathJax = {
|
||||||
|
tex: {
|
||||||
|
inlineMath: [["\\(", "\\)"]],
|
||||||
|
displayMath: [["\\[", "\\]"]],
|
||||||
|
processEscapes: true,
|
||||||
|
processEnvironments: true
|
||||||
|
},
|
||||||
|
options: {
|
||||||
|
ignoreHtmlClass: ".*|",
|
||||||
|
processHtmlClass: "arithmatex"
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
document$.subscribe(() => {
|
||||||
|
MathJax.startup.output.clearCache()
|
||||||
|
MathJax.typesetClear()
|
||||||
|
MathJax.texReset()
|
||||||
|
MathJax.typesetPromise()
|
||||||
|
})
|
||||||
|
|
||||||
@@ -0,0 +1,25 @@
|
|||||||
|
(function () {
|
||||||
|
function initMermaid() {
|
||||||
|
if (window.mermaid && typeof window.mermaid.initialize === 'function') {
|
||||||
|
try {
|
||||||
|
// Initialize once per page render; SPA transitions are handled below
|
||||||
|
window.mermaid.initialize({ startOnLoad: false, securityLevel: 'loose' });
|
||||||
|
window.mermaid.init(undefined, document.querySelectorAll('.mermaid'));
|
||||||
|
} catch (e) {
|
||||||
|
console.warn('Mermaid init failed:', e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Initial load
|
||||||
|
if (document.readyState === 'loading') {
|
||||||
|
document.addEventListener('DOMContentLoaded', initMermaid);
|
||||||
|
} else {
|
||||||
|
initMermaid();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Re-init on MkDocs Material page transitions (instant loading)
|
||||||
|
if (window.document$ && typeof window.document$.subscribe === 'function') {
|
||||||
|
window.document$.subscribe(initMermaid);
|
||||||
|
}
|
||||||
|
})();
|
||||||
@@ -0,0 +1,78 @@
|
|||||||
|
# درسنامه ۱: دستورات `pwd` و `cd`
|
||||||
|
|
||||||
|
## دایرکتوری چیست؟
|
||||||
|
دایرکتوری (Directory) در سیستمعاملهای شبه یونیکس همان پوشهای است که مجموعهای از فایلها و دایرکتوریهای دیگر را در خود نگه میدارد. دایرکتوریها فضای فیزیکی جدیدی ایجاد نمیکنند، بلکه ساختاری منطقی برای سازماندهی و جستوجوی فایلها هستند. به کمک این ساختار میتوانیم مسیر هر فایل را به صورت دقیق مشخص کنیم.
|
||||||
|
|
||||||
|
برای درک بهتر میتوانید ساختار یک دایرکتوری را با دستور `tree` مشاهده کنید:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ tree ~/projects/demo
|
||||||
|
/home/user/projects/demo
|
||||||
|
├── README.md
|
||||||
|
├── src
|
||||||
|
│ └── main.py
|
||||||
|
└── docs
|
||||||
|
└── guide.md
|
||||||
|
```
|
||||||
|
|
||||||
|
## دایرکتوری فعلی (Current Directory)
|
||||||
|
هر جلسهای که در ترمینال باز میکنیم، درون یک دایرکتوری مشخص شروع میشود که به آن «دایرکتوری فعلی» یا «پوشهٔ کاری کنونی» میگوییم. به طور پیشفرض، ترمینالهای لینوکسی در دایرکتوری خانگی کاربر (`/home/<USERNAME>`) اجرا میشوند.
|
||||||
|
|
||||||
|
## دستور `pwd`
|
||||||
|
دستور `pwd` مخفف *Print Working Directory* است و مسیر کامل دایرکتوری فعلی شما را نمایش میدهد. این دستور هیچ ورودی دیگری نیاز ندارد و خروجی آن همواره یک مسیر مطلق (Absolute Path) است.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ pwd
|
||||||
|
/home/<USERNAME>
|
||||||
|
```
|
||||||
|
|
||||||
|
## دستور `cd`
|
||||||
|
دستور `cd` مخفف *Change Directory* است و برای جابهجایی بین دایرکتوریها استفاده میشود. مسیر مقصد را میتوان به دو شکل مشخص کرد:
|
||||||
|
|
||||||
|
### مسیر مطلق (Absolute Path)
|
||||||
|
در مسیر مطلق، مسیر کامل از ریشهٔ سیستم فایل (`/`) تا مقصد را مینویسیم. این روش مستقل از دایرکتوری فعلی است.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ cd /home/<USERNAME>/Desktop
|
||||||
|
$ pwd
|
||||||
|
/home/<USERNAME>/Desktop
|
||||||
|
```
|
||||||
|
|
||||||
|
### مسیر نسبی (Relative Path)
|
||||||
|
در مسیر نسبی، مقصد را نسبت به دایرکتوری فعلی مشخص میکنیم. چند نکته کلیدی:
|
||||||
|
|
||||||
|
- `.` به معنای دایرکتوری فعلی است.
|
||||||
|
- `..` به معنای دایرکتوری والد (یک پله بالاتر) است.
|
||||||
|
- مسیرها میتوانند چندین بار از `..` استفاده کنند، مانند `../../logs`.
|
||||||
|
|
||||||
|
اگر ترمینال در دایرکتوری `/home/<USERNAME>` قرار دارد، دستورات زیر همگی شما را به دسکتاپ میرسانند:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ cd Desktop
|
||||||
|
$ pwd
|
||||||
|
/home/<USERNAME>/Desktop
|
||||||
|
```
|
||||||
|
|
||||||
|
یا با استفاده از `..` برای بازگشت به والد و سپس رفتن به مقصد جدید:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ cd ../Downloads
|
||||||
|
$ pwd
|
||||||
|
/home/<USERNAME>/Downloads
|
||||||
|
```
|
||||||
|
|
||||||
|
## میانبر `~`
|
||||||
|
کرکتر `~` نمایندهٔ دایرکتوری خانگی کاربر فعلی است. این نماد در هر مسیری که استفاده شود، ابتدا به مسیر کامل دایرکتوری خانگی گسترش پیدا میکند. بنابراین سه دستور زیر نتیجهٔ یکسانی دارند:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ cd /home/<USERNAME>/Desktop
|
||||||
|
$ cd ~/Desktop
|
||||||
|
$ cd "$HOME/Desktop"
|
||||||
|
```
|
||||||
|
|
||||||
|
## توصیهٔ تکمیلی
|
||||||
|
- برای تأیید تغییر مسیر پس از هر `cd`، بلافاصله `pwd` اجرا کنید.
|
||||||
|
- دستور `cd -` شما را به دایرکتوری قبلی بازمیگرداند.
|
||||||
|
- اگر مسیر شامل فاصله باشد، آن را درون کوتیشن قرار دهید یا از کاراکتر `\` برای فرار دادن فاصله استفاده کنید، مانند `cd "My Projects"`.
|
||||||
|
|
||||||
|
با تسلط بر `pwd` و `cd`، پیمایش در ساختار فایلها و مدیریت پروژهها در ترمینال بسیار سادهتر خواهد شد.
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
# درسنامه ۱۰: استاندارد استریمها در لینوکس
|
||||||
|
|
||||||
|
## آشنایی با سه جریان اصلی
|
||||||
|
برنامههای خط فرمان معمولاً با سه جریان ورودی/خروجی کار میکنند:
|
||||||
|
|
||||||
|
- `STDIN` (Standard Input) با شمارهٔ فایل ۰، ورودی پیشفرض برنامه است که اغلب از صفحهکلید دریافت میشود.
|
||||||
|
- `STDOUT` (Standard Output) با شمارهٔ فایل ۱، خروجی معمولی برنامه است.
|
||||||
|
- `STDERR` (Standard Error) با شمارهٔ فایل ۲، پیامهای خطا و هشدار را نگه میدارد.
|
||||||
|
|
||||||
|
درک این جریانها کمک میکند رفتار برنامهها را بهتر کنترل کنید و خروجی مورد نیاز را به فایلها یا دستورات دیگر هدایت کنید.
|
||||||
|
|
||||||
|
## تغییر مسیر خروجی
|
||||||
|
با عملگر `>` میتوان خروجی استاندارد را در فایل ذخیره کرد. اگر فایل موجود باشد بازنویسی میشود؛ برای افزودن به انتهای فایل از `>>` استفاده کنید.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ ls > listing.txt
|
||||||
|
$ ls -a >> listing.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
برای هدایت خروجی خطا به فایل دیگر از `2>` استفاده کنید، زیرا عدد فایل ۲ نمایندهٔ `STDERR` است.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ ls /nonexistent 2> errors.log
|
||||||
|
```
|
||||||
|
|
||||||
|
اگر میخواهید خروجی عادی و خطا در یک فایل قرار بگیرند، یکی را به دیگری هدایت کنید:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ make > build.log 2>&1
|
||||||
|
```
|
||||||
|
|
||||||
|
## تغییر مسیر ورودی
|
||||||
|
با استفاده از `<` میتوانید ورودی برنامه را از فایل تأمین کنید. برنامههای تعاملی که در حالت عادی منتظر تایپ کاربر هستند، در این حالت دادهها را از فایل میخوانند.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ sort < unsorted-names.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
این تکنیک در خودکارسازی فرایندها و تست برنامهها بسیار کاربردی است.
|
||||||
|
|
||||||
|
## استفاده از `tee` برای تقسیم خروجی
|
||||||
|
دستور `tee` خروجی برنامه را همزمان روی صفحه نمایش میدهد و داخل فایل ذخیره میکند. این کار زمانی مفید است که بخواهید خروجی را در لحظه ببینید و نسخهٔ ثبتشده هم داشته باشید.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ ls -l | tee listing.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
گزینهٔ `-a` به `tee` میگوید که به انتهای فایل اضافه کند.
|
||||||
|
|
||||||
|
## جمعبندی
|
||||||
|
- استریمها واحدهای پایهٔ انتقال داده هستند؛ با شناخت آنها رفتار برنامههای خط فرمان قابل پیشبینی میشود.
|
||||||
|
- ترکیب درست عملگرهای تغییر مسیر (`>`, `>>`, `<`, `2>`, `&>`) به شما اجازه میدهد خروجیها را جدا کنید، ذخیره کنید یا به برنامههای دیگر بدهید.
|
||||||
|
- حتی در اسکریپتهای پیچیده، این اصول ساده به شما کمک میکنند خطاها را ثبت و فرایندها را عیبیابی کنید.
|
||||||
@@ -0,0 +1,58 @@
|
|||||||
|
# درسنامه ۱۱: ساخت پایپلاین در خط فرمان لینوکس
|
||||||
|
|
||||||
|
## مفهوم پایپلاین
|
||||||
|
پایپلاین (Pipeline) به اتصال خروجی یک دستور به ورودی استاندارد دستور بعدی گفته میشود. این اتصال با کاراکتر `|` انجام میشود و به شما اجازه میدهد ابزارهای ساده را کنار هم قرار دهید تا کار پیچیدهتری انجام دهند.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ ls | sort
|
||||||
|
```
|
||||||
|
|
||||||
|
در این مثال، `ls` فهرست فایلها را تولید میکند و `sort` همان لیست را مرتب میکند.
|
||||||
|
|
||||||
|
## زنجیرههای چند مرحلهای
|
||||||
|
میتوانید چندین دستور را پشت سر هم زنجیره کنید. هر مرحله دادههای خود را به مرحلهٔ بعدی میدهد.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ ls /etc | grep "^ssh" | sort | nl
|
||||||
|
```
|
||||||
|
|
||||||
|
توضیح مراحل:
|
||||||
|
1. `ls /etc`: فهرست فایلهای `/etc`.
|
||||||
|
2. `grep "^ssh"`: فیلتر کردن مواردی که با `ssh` شروع میشوند.
|
||||||
|
3. `sort`: مرتبسازی نتایج.
|
||||||
|
4. `nl`: شمارهگذاری خطوط خروجی نهایی.
|
||||||
|
|
||||||
|
## فیلتر کردن و جمعآوری دادهها
|
||||||
|
پایپلاینها با ابزارهای متنی مانند `grep`, `cut`, `awk` و `wc` بسیار قدرتمند میشوند.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ ps aux | grep python | grep -v grep | wc -l
|
||||||
|
```
|
||||||
|
|
||||||
|
- `ps aux`: همهٔ فرایندها را نشان میدهد.
|
||||||
|
- `grep python`: فقط فرایندهای شامل واژهٔ `python`.
|
||||||
|
- `grep -v grep`: حذف خطی که خود `grep` تولید کرده است.
|
||||||
|
- `wc -l`: شمارش تعداد خطوط باقیمانده.
|
||||||
|
|
||||||
|
## هدایت داده به فایل یا شبکه
|
||||||
|
پایپلاینها فقط محدود به نمایش در ترمینال نیستند. خروجی نهایی را میتوان با تغییر مسیر در فایل ذخیره کرد یا برای برنامههای دیگر فرستاد.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ journalctl -n 200 | grep sshd | tee ssh-logins.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
در این مثال خروجی فیلتر شده علاوه بر نمایش، در فایل `ssh-logins.txt` هم نوشته میشود.
|
||||||
|
|
||||||
|
## پایپهای پیشرفته
|
||||||
|
- `command1 |& command2`: این ساختار در Bash خروجی استاندارد و خطا را با هم به `command2` میدهد.
|
||||||
|
- `xargs`: ورودی پایپ را به صورت آرگومانهای جدید استفاده میکند و برای اجرای دستهای دستورات مفید است.
|
||||||
|
```bash
|
||||||
|
$ ls *.log | xargs -n 1 gzip
|
||||||
|
```
|
||||||
|
|
||||||
|
- از Bash نسخهٔ ۴ به بعد، میتوانید با `coproc` پایپلاینهای تعاملی ایجاد کنید که دادهها را به صورت غیرهمزمان پردازش میکنند؛ اگرچه این فراتر از محدودهٔ این درس است.
|
||||||
|
|
||||||
|
## نکات عملی
|
||||||
|
- هر مرحله باید کاری مشخص و کوچک انجام دهد؛ این فلسفهٔ «ابزارهای کوچک، کارهای بزرگ» یونیکس است.
|
||||||
|
- برای اشکالزدایی، میتوانید در میانهٔ پایپلاین دستور `tee` یا `cat -n` قرار دهید تا ببینید دادهها در هر مرحله چه تغییری کردهاند.
|
||||||
|
- پایپلاینها در اسکریپتنویسی Shell کمک میکنند بدون نوشتن برنامهٔ پیچیده، دادهها را پردازش و گزارشگیری کنید.
|
||||||
@@ -0,0 +1,63 @@
|
|||||||
|
# درسنامه ۲-۱: آشنایی با file و du
|
||||||
|
|
||||||
|
در این درس با دو ابزار کاربردی برای شناخت نوع فایل و بررسی فضای اشغالشده آشنا میشویم.
|
||||||
|
|
||||||
|
## file — تشخیص نوع فایل
|
||||||
|
- کار: تشخیص نوع واقعی فایل (متنی، باینری، اسکریپت، عکس و ...).
|
||||||
|
- موارد استفادهٔ رایج:
|
||||||
|
|
||||||
|
```
|
||||||
|
file README.md
|
||||||
|
file /bin/ls
|
||||||
|
file -b image.png # فقط نوع، بدون نام فایل
|
||||||
|
file -i report.pdf # نمایش MIME type
|
||||||
|
```
|
||||||
|
|
||||||
|
نکته: پسوند همیشه قابل اعتماد نیست؛ `file` محتوای واقعی را بررسی میکند.
|
||||||
|
|
||||||
|
## du — میزان فضای اشغالشده
|
||||||
|
- کار: نمایش اندازهٔ فایل/دایرکتوری بر روی دیسک.
|
||||||
|
- گزینههای مفید:
|
||||||
|
|
||||||
|
```
|
||||||
|
du -h . # اندازهٔ اقلام در مسیر جاری (خوانا)
|
||||||
|
du -sh . # فقط جمع کل پوشهٔ جاری
|
||||||
|
du -h --max-depth=1 ~ # اندازهٔ زیردایرکتوریها تا یک عمق
|
||||||
|
```
|
||||||
|
|
||||||
|
تفاوت با `df`: دستور `df` فضای آزاد/مصرفی پارتیشن را نشان میدهد، نه یک پوشهٔ خاص.
|
||||||
|
|
||||||
|
## تمرین کوتاه
|
||||||
|
- نوع چند فایل مختلف در سیستم را با `file` بررسی کنید.
|
||||||
|
- اندازهٔ پوشهٔ Downloads خود را با `du -sh ~/Downloads` ببینید.
|
||||||
|
|
||||||
|
## نکات و مثالهای بیشتر
|
||||||
|
- برای چند فایل باهم:
|
||||||
|
|
||||||
|
```
|
||||||
|
file *.png
|
||||||
|
du -sh ~/Projects/*
|
||||||
|
```
|
||||||
|
|
||||||
|
- تفکیک بزرگترین پوشهها در یک مسیر (نمای کلی سریع):
|
||||||
|
|
||||||
|
```
|
||||||
|
du -h --max-depth=1 ~/Downloads | sort -h
|
||||||
|
```
|
||||||
|
|
||||||
|
- بررسی نوع فایل ناشناس که پسوند ندارد:
|
||||||
|
|
||||||
|
```
|
||||||
|
file unknown_file
|
||||||
|
```
|
||||||
|
|
||||||
|
- مقایسهٔ `size` ظاهری vs. فضای دیسک (Sparse Files):
|
||||||
|
|
||||||
|
```
|
||||||
|
ls -lh bigfile
|
||||||
|
du -h bigfile
|
||||||
|
```
|
||||||
|
|
||||||
|
## خطاهای رایج
|
||||||
|
- اشتباه گرفتن `du` با `df`: اولی اندازهٔ مسیر را میدهد، دومی وضعیت پارتیشن را.
|
||||||
|
- فراموش کردن `-h` و خوانایی خروجی.
|
||||||
@@ -0,0 +1,47 @@
|
|||||||
|
# درسنامه ۲-۱۰: فشردهسازی و آرشیو فایلها
|
||||||
|
|
||||||
|
با `tar` میتوان چند فایل/پوشه را در یک آرشیو قرارداد و با `gzip`/`bzip2`/`xz` آن را فشرده کرد. `zip`/`unzip` نیز رایج هستند.
|
||||||
|
|
||||||
|
## tar + gzip
|
||||||
|
```
|
||||||
|
tar -czf backup.tar.gz mydir/ # ساخت آرشیو فشرده
|
||||||
|
tar -tzf backup.tar.gz # مشاهدهٔ محتوا
|
||||||
|
tar -xzf backup.tar.gz -C /tmp # استخراج در مقصد
|
||||||
|
```
|
||||||
|
|
||||||
|
## zip
|
||||||
|
```
|
||||||
|
zip -r project.zip src/ README.md
|
||||||
|
unzip project.zip -d ./extracted
|
||||||
|
```
|
||||||
|
|
||||||
|
نکته: پسوندها رایجاند اما تعیینکنندهٔ فرمت نیستند؛ از سوئیچهای درست استفاده کنید.
|
||||||
|
|
||||||
|
## تمرین کوتاه
|
||||||
|
- از یک پوشهٔ پروژه آرشیو `tar.gz` بگیرید و در مسیر دیگری استخراج کنید.
|
||||||
|
- چند فایل را در یک `zip` بگذارید و محتوایش را بررسی کنید.
|
||||||
|
|
||||||
|
## نکات و مثالهای بیشتر
|
||||||
|
- حفظ مجوزها و زمانها در `tar`: بهصورت پیشفرض حفظ میشوند؛ برای فشردهسازیهای دیگر میتوانید از `-p` هنگام استخراج استفاده کنید.
|
||||||
|
- فشردهسازهای جایگزین:
|
||||||
|
|
||||||
|
```
|
||||||
|
tar -cJf backup.tar.xz dir/ # xz
|
||||||
|
tar -cjf backup.tar.bz2 dir/ # bzip2
|
||||||
|
```
|
||||||
|
|
||||||
|
- استخراج بخشی از آرشیو:
|
||||||
|
|
||||||
|
```
|
||||||
|
tar -xzf backup.tar.gz path/inside/archive.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
- بررسی اندازهٔ مؤثر قبل/بعد از فشردهسازی:
|
||||||
|
|
||||||
|
```
|
||||||
|
du -sh dir/ backup.tar.gz
|
||||||
|
```
|
||||||
|
|
||||||
|
## خطاهای رایج
|
||||||
|
- قاطیکردن ترتیب فلگهای `tar`؛ شکلهای `-czf` و `-xzf` را به خاطر بسپارید.
|
||||||
|
- استخراج در مسیر اشتباه؛ از `-C` برای تعیین مقصد استفاده کنید.
|
||||||
@@ -0,0 +1,58 @@
|
|||||||
|
# درسنامه ۲-۱۱: مقدمهای بر awk
|
||||||
|
|
||||||
|
`awk` یک ابزار قدرتمند پردازش متن سطربهسطر با الگو و عمل (pattern-action) است.
|
||||||
|
|
||||||
|
## ساختار پایه
|
||||||
|
```
|
||||||
|
awk 'شرط {عمل}' FILE
|
||||||
|
```
|
||||||
|
|
||||||
|
## مثالهای رایج
|
||||||
|
```
|
||||||
|
# چاپ ستونهای مشخص (جداکنندهٔ پیشفرض: فاصله/تب)
|
||||||
|
awk '{print $1, $3}' data.txt
|
||||||
|
|
||||||
|
# تعیین جداکنندهٔ سفارشی (مثلاً CSV)
|
||||||
|
awk -F, '{print $1 "," $3}' data.csv
|
||||||
|
|
||||||
|
# فیلتر: فقط سطرهایی که ستون سومشان > 80 است
|
||||||
|
awk '$3 > 80 {print $0}' scores.txt
|
||||||
|
|
||||||
|
# جمع مقادیر یک ستون و چاپ مجموع
|
||||||
|
awk '{sum += $2} END {print sum}' prices.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
نکته: وقتی نیازها از `cut`/`grep` فراتر رفت، معمولاً `awk` انتخاب بهتری است.
|
||||||
|
|
||||||
|
## تمرین کوتاه
|
||||||
|
- از یک فایل CSV نام و امتیاز را چاپ کنید.
|
||||||
|
- جمع یک ستون عددی را محاسبه کنید.
|
||||||
|
|
||||||
|
## نکات و مثالهای بیشتر
|
||||||
|
- تعیین جداکنندهٔ خروجی سفارشی:
|
||||||
|
|
||||||
|
```
|
||||||
|
awk -F, 'BEGIN{OFS=","} {print $1,$3}' data.csv
|
||||||
|
```
|
||||||
|
|
||||||
|
- افزودن سرستون و قالببندی خروجی:
|
||||||
|
|
||||||
|
```
|
||||||
|
awk -F, 'BEGIN{print "name,score"} {print $1 "," $2}' scores.csv
|
||||||
|
```
|
||||||
|
|
||||||
|
- استفاده از شرط و else:
|
||||||
|
|
||||||
|
```
|
||||||
|
awk '$3 >= 60 {pass++} $3 < 60 {fail++} END{print pass, fail}' scores.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
- انتخاب سطرهای دارای تطابق regex:
|
||||||
|
|
||||||
|
```
|
||||||
|
awk '/ERROR/ {print NR ":", $0}' app.log
|
||||||
|
```
|
||||||
|
|
||||||
|
## خطاهای رایج
|
||||||
|
- قاطیکردن جداکنندهٔ ورودی (`-F`) با جداکنندهٔ خروجی (`OFS`).
|
||||||
|
- فراموشی نقلقول صحیح در اسکریپتهای چندبخشی شل.
|
||||||
@@ -0,0 +1,47 @@
|
|||||||
|
# درسنامه ۲-۲: ادیتورهای پیشفرض لینوکس (nano و vim)
|
||||||
|
|
||||||
|
در این درس با دو ویرایشگر متنی رایج آشنا میشوید: `nano` (ساده و مناسب شروع) و `vim` (قدرتمند و پرکاربرد).
|
||||||
|
|
||||||
|
## nano — شروع سریع
|
||||||
|
- اجرا: `nano FILE`
|
||||||
|
- کلیدهای ضروری:
|
||||||
|
- ذخیره: `Ctrl + O` سپس Enter
|
||||||
|
- خروج: `Ctrl + X`
|
||||||
|
- جستوجو: `Ctrl + W`
|
||||||
|
|
||||||
|
مثال:
|
||||||
|
```
|
||||||
|
nano notes.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
## vim — مفاهیم پایه
|
||||||
|
- اجرا: `vim FILE`
|
||||||
|
- حالتها: «نرمال» و «ویرایش».
|
||||||
|
- ورود به ویرایش: `i`
|
||||||
|
- ذخیره و خروج: `Esc` سپس `:wq` Enter
|
||||||
|
- خروج بدون ذخیره: `Esc` سپس `:q!` Enter
|
||||||
|
|
||||||
|
مثال:
|
||||||
|
```
|
||||||
|
vim report.md
|
||||||
|
```
|
||||||
|
|
||||||
|
## تمرین کوتاه
|
||||||
|
- یک فایل متنی ایجاد و در nano چند خط بنویسید و ذخیره کنید.
|
||||||
|
- همان فایل را در vim باز کنید و یک خط به آن بیفزایید و ذخیره کنید.
|
||||||
|
|
||||||
|
## نکات و میانبُرها
|
||||||
|
- nano:
|
||||||
|
- بریدن/چسباندن خط: `Ctrl + K` / `Ctrl + U`
|
||||||
|
- رفتن به شمارهٔ خط: `Ctrl + _` سپس شماره
|
||||||
|
- فعالکردن شمارهٔ خطوط: `Alt + N`
|
||||||
|
|
||||||
|
- vim (حداقلهای مفید):
|
||||||
|
- حرکت: `h j k l`
|
||||||
|
- حذف خط: `dd`
|
||||||
|
- کپی/چسباندن: `yy` و `p`
|
||||||
|
- جستوجو: `/کلمه` و حرکت بین نتایج با `n`
|
||||||
|
|
||||||
|
## پیشنهاد تمرین بیشتر
|
||||||
|
- در nano یک پاراگراف را بریدن و در جای دیگر بچسبانید.
|
||||||
|
- در vim چند خط را با `V` انتخاب و حذف/کپی کنید.
|
||||||
@@ -0,0 +1,39 @@
|
|||||||
|
# درسنامه ۲-۳: دایرکتوریهای مهم و ساختار فایلبندی لینوکس
|
||||||
|
|
||||||
|
در لینوکس همهچیز از ریشه (`/`) آغاز میشود. چند مسیر مهم:
|
||||||
|
|
||||||
|
- `/home`: پوشههای خانگی کاربران
|
||||||
|
- `/etc`: فایلهای پیکربندی سیستم
|
||||||
|
- `/var`: دادههای متغیر (لاگها، صفها)
|
||||||
|
- `/usr`: برنامهها و کتابخانههای کاربری
|
||||||
|
- `/bin`, `/sbin`: ابزارهای ضروری سیستم
|
||||||
|
- `/tmp`: فایلهای موقتی
|
||||||
|
- `/dev`, `/proc`: دستگاهها و اطلاعات هسته
|
||||||
|
|
||||||
|
## مثالهای پایه
|
||||||
|
```
|
||||||
|
pwd # مسیر فعلی
|
||||||
|
ls / # فهرست ریشه
|
||||||
|
ls -l /home # کاربران موجود
|
||||||
|
cd /etc && ls -l # تنظیمات سیستم
|
||||||
|
```
|
||||||
|
|
||||||
|
نکته: تغییر و ویرایش در `/etc` و مسیرهای سیستمی نیاز به دقت و سطح دسترسی دارد.
|
||||||
|
|
||||||
|
## تمرین کوتاه
|
||||||
|
- چند مسیر بالا را بررسی کنید و با `ls -lh` محتوا را ببینید.
|
||||||
|
- مسیر خانگی خود را پیدا کنید و به آن برگردید: `cd ~`.
|
||||||
|
|
||||||
|
## نکات تکمیلی
|
||||||
|
- تفاوت `/usr/bin` و `/bin`: در توزیعهای جدید اغلب یکسانسازی (symlink) شدهاند، اما بهطور سنتی `/bin` ابزارهای ضروری بوت را داشت.
|
||||||
|
- `/var/log`: لاگ سرویسها اینجاست؛ برای بررسی سریع:
|
||||||
|
|
||||||
|
```
|
||||||
|
ls -lh /var/log
|
||||||
|
sudo tail -n 50 /var/log/syslog
|
||||||
|
```
|
||||||
|
|
||||||
|
- `/proc` و `/sys`: فایلهای مجازی هسته؛ اندازهها واقعی نیستند و روی دیسک ذخیره نمیشوند.
|
||||||
|
|
||||||
|
## تمرین بیشتر
|
||||||
|
- با `tree -L 2 /etc` یا `ls -R /etc | less` نمای کلی از تنظیمات بگیرید.
|
||||||
@@ -0,0 +1,43 @@
|
|||||||
|
# درسنامه ۲-۴: مشاهدهٔ محتوا با more، less، head و tail
|
||||||
|
|
||||||
|
این ابزارها برای دیدن سریع فایلهای متنی کاربردی هستند.
|
||||||
|
|
||||||
|
## head و tail — ابتدا و انتهای فایل
|
||||||
|
```
|
||||||
|
head -n 20 README.md # 20 خط اول
|
||||||
|
tail -n 50 app.log # 50 خط آخر
|
||||||
|
tail -f app.log # دنبالکردن زندهٔ لاگ
|
||||||
|
```
|
||||||
|
|
||||||
|
## more و less — مرور صفحهبهصفحه
|
||||||
|
```
|
||||||
|
more bigfile.txt
|
||||||
|
less bigfile.txt
|
||||||
|
```
|
||||||
|
- در `less` با کلیدهای جهتدار یا Space جابهجا شوید؛ خروج: `q`
|
||||||
|
- جستوجو در `less`: کلید `/` سپس عبارت؛ بعدی: `n`
|
||||||
|
- دنبالکردن زنده در `less`: کلید `Shift + F`
|
||||||
|
|
||||||
|
## تمرین کوتاه
|
||||||
|
- با `head` و `tail` بخشهای ابتدا/انتها را ببینید.
|
||||||
|
- یک لاگ را با `tail -f` دنبال کنید و سپس در `less` جستوجو انجام دهید.
|
||||||
|
|
||||||
|
## نکات و ترفندها
|
||||||
|
- نمایش شمارهٔ خطوط در `nl` و لولهکردن به `less`:
|
||||||
|
|
||||||
|
```
|
||||||
|
nl -ba README.md | less
|
||||||
|
```
|
||||||
|
|
||||||
|
- دیدن n خط قبل/بعد از تطابق با `grep -n` و سپس بازکردن همان خطوط در `less`:
|
||||||
|
|
||||||
|
```
|
||||||
|
grep -n "ERROR" app.log | head
|
||||||
|
less +123 app.log # پرش به خط 123
|
||||||
|
```
|
||||||
|
|
||||||
|
- دنبالکردن چند فایل همزمان:
|
||||||
|
|
||||||
|
```
|
||||||
|
tail -f app1.log app2.log
|
||||||
|
```
|
||||||
@@ -0,0 +1,48 @@
|
|||||||
|
# درسنامه ۲-۵: برش متن با cut
|
||||||
|
|
||||||
|
`cut` برای جداکردن ستونها یا کاراکترهای خاص از هر خط استفاده میشود.
|
||||||
|
|
||||||
|
## بر اساس جداکننده (delimiter)
|
||||||
|
```
|
||||||
|
# فرض: فایل CSV با جداکنندهٔ کاما
|
||||||
|
cut -d, -f1 names.csv # ستون اول
|
||||||
|
cut -d, -f1,3 data.csv # ستونهای 1 و 3
|
||||||
|
cut -d: -f1 /etc/passwd # نام کاربریها
|
||||||
|
```
|
||||||
|
|
||||||
|
## بر اساس موقعیت کاراکتر
|
||||||
|
```
|
||||||
|
cut -c1-10 report.txt # کاراکترهای 1 تا 10 هر خط
|
||||||
|
```
|
||||||
|
|
||||||
|
نکته: اگر فاصلهها نامنظماند، ابتدا فاصلههای پیاپی را یکتایی کنید:
|
||||||
|
```
|
||||||
|
tr -s ' ' < file.txt | cut -d' ' -f2
|
||||||
|
```
|
||||||
|
|
||||||
|
## تمرین کوتاه
|
||||||
|
- از یک فایل نمونه، ستونهای دلخواه را استخراج کنید.
|
||||||
|
- نام کاربریها را از `/etc/passwd` بیرون بکشید و در فایلی ذخیره کنید.
|
||||||
|
|
||||||
|
## نکات و مثالهای بیشتر
|
||||||
|
- نادیدهگرفتن خطهای خالی قبل از برش:
|
||||||
|
|
||||||
|
```
|
||||||
|
grep -v '^$' data.txt | cut -d',' -f2
|
||||||
|
```
|
||||||
|
|
||||||
|
- برش بازهها و چند ستون ترکیبی:
|
||||||
|
|
||||||
|
```
|
||||||
|
cut -d',' -f1-2,5 report.csv
|
||||||
|
```
|
||||||
|
|
||||||
|
- وقتی جداکننده تب است:
|
||||||
|
|
||||||
|
```
|
||||||
|
cut -f1,3 metrics.tsv
|
||||||
|
```
|
||||||
|
|
||||||
|
## خطاهای رایج
|
||||||
|
- استفاده از `cut -d ' '` روی متنهایی با فاصلههای نامنظم؛ ابتدا فاصلهها را یکدست کنید (`tr -s ' '`).
|
||||||
|
- فراموشی نقلقول در جداکنندههایی با کاراکترهای خاص شل.
|
||||||
@@ -0,0 +1,49 @@
|
|||||||
|
# درسنامه ۲-۶: مرتبسازی و شمارش با sort و wc
|
||||||
|
|
||||||
|
این دو ابزار برای مرتبسازی و گرفتن آمار خطوط/کلمات کاربرد دارند.
|
||||||
|
|
||||||
|
## sort — مرتبسازی
|
||||||
|
```
|
||||||
|
sort names.txt # مرتبسازی الفبایی
|
||||||
|
sort -n scores.txt # مرتبسازی عددی
|
||||||
|
sort -u words.txt # حذف تکراریها هنگام مرتبسازی
|
||||||
|
```
|
||||||
|
|
||||||
|
## wc — شمارنده
|
||||||
|
```
|
||||||
|
wc -l file.txt # تعداد خطوط
|
||||||
|
wc -w file.txt # تعداد کلمات
|
||||||
|
wc -c file.txt # تعداد بایتها
|
||||||
|
```
|
||||||
|
|
||||||
|
## الگوی پرتکرار: شمارش فراوانی
|
||||||
|
```
|
||||||
|
sort words.txt | uniq -c | sort -nr | head
|
||||||
|
```
|
||||||
|
|
||||||
|
## تمرین کوتاه
|
||||||
|
- لیست نمرهها را عددی مرتب کنید و بیشترینها را ببینید.
|
||||||
|
- فراوانی واژهها را در یک متن کوتاه محاسبه کنید.
|
||||||
|
|
||||||
|
## نکات و مثالهای بیشتر
|
||||||
|
- مرتبسازی بر اساس ستون خاص (با جداکنندهٔ کاما):
|
||||||
|
|
||||||
|
```
|
||||||
|
sort -t, -k3,3n scores.csv # ستون سوم، عددی
|
||||||
|
```
|
||||||
|
|
||||||
|
- حذف تکراریها پس از مرتبسازی و شمارش:
|
||||||
|
|
||||||
|
```
|
||||||
|
sort names.txt | uniq -c | sort -nr
|
||||||
|
```
|
||||||
|
|
||||||
|
- شمارش خطوط چند فایل باهم و جمع کل:
|
||||||
|
|
||||||
|
```
|
||||||
|
wc -l *.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
## خطاهای رایج
|
||||||
|
- فراموش کردن `-n` برای مرتبسازی عددی.
|
||||||
|
- عدم تعیین جداکنندهٔ درست با `-t` هنگام کار با CSV/TSV.
|
||||||
@@ -0,0 +1,52 @@
|
|||||||
|
# درسنامه ۲-۷: جستوجو در متن با grep
|
||||||
|
|
||||||
|
`grep` خطوط شامل الگو (pattern) را پیدا میکند.
|
||||||
|
|
||||||
|
## مثالهای پایه
|
||||||
|
```
|
||||||
|
grep "ERROR" app.log # جستوجوی ساده
|
||||||
|
grep -n "TODO" src/*.py # با شمارهٔ خط
|
||||||
|
grep -i "linux" notes.txt # بدون حساسیت به حروف
|
||||||
|
grep -r "config" /etc # بازگشتی در دایرکتوری
|
||||||
|
```
|
||||||
|
|
||||||
|
## الگوهای پیشرفته
|
||||||
|
```
|
||||||
|
grep -E "^WARN|^ERROR" app.log # چند الگو با regex
|
||||||
|
grep -v "DEBUG" app.log # نمایش خطوطی که شامل DEBUG نیستند
|
||||||
|
```
|
||||||
|
|
||||||
|
## تمرین کوتاه
|
||||||
|
- در یک پوشهٔ کدی، همهٔ TODOها را با شمارهٔ خط پیدا کنید.
|
||||||
|
- از خروجی `dmesg` فقط هشدارها و خطاها را استخراج کنید.
|
||||||
|
|
||||||
|
## نکات و مثالهای بیشتر
|
||||||
|
- جستوجو حساس/غیرحساس به حروف:
|
||||||
|
|
||||||
|
```
|
||||||
|
grep "Linux" file.txt
|
||||||
|
grep -i "linux" file.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
- نمایش فقط بخش تطابق (با `-o`) و شمارش تعداد تطابقها (با `-c`):
|
||||||
|
|
||||||
|
```
|
||||||
|
grep -o "ERROR" app.log | wc -l
|
||||||
|
grep -c "ERROR" app.log
|
||||||
|
```
|
||||||
|
|
||||||
|
- محدودکردن به تطابق کامل کلمه (word boundary):
|
||||||
|
|
||||||
|
```
|
||||||
|
grep -w "ERROR" app.log
|
||||||
|
```
|
||||||
|
|
||||||
|
- رنگیکردن خروجی برای خوانایی بهتر:
|
||||||
|
|
||||||
|
```
|
||||||
|
grep --color=auto -n "pattern" file
|
||||||
|
```
|
||||||
|
|
||||||
|
## خطاهای رایج
|
||||||
|
- فراموش کردن نقلقول دور الگوهای حاوی کاراکترهای خاص شل.
|
||||||
|
- استفادهٔ نابهجا از `-r` در مسیرهای خیلی بزرگ (کندی زیاد)؛ ابتدا محدوده را کوچک کنید.
|
||||||
@@ -0,0 +1,53 @@
|
|||||||
|
# درسنامه ۲-۸: جستوجوی فایلها با find
|
||||||
|
|
||||||
|
`find` فایلها/پوشهها را بر اساس نام، نوع، اندازه، زمان و ... پیدا میکند.
|
||||||
|
|
||||||
|
## مثالهای کاربردی
|
||||||
|
```
|
||||||
|
find . -type f -name "*.log" # همهٔ فایلهای log
|
||||||
|
find ~ -type d -name "venv" # دایرکتوریهای venv
|
||||||
|
find /var/log -type f -size +5M # بزرگتر از ۵ مگابایت
|
||||||
|
find . -type f -mtime -7 # تغییر کرده در ۷ روز گذشته
|
||||||
|
```
|
||||||
|
|
||||||
|
## اجرای فرمان روی نتایج
|
||||||
|
```
|
||||||
|
find . -type f -name "*.tmp" -delete
|
||||||
|
find . -type f -name "*.txt" -exec wc -l {} +
|
||||||
|
```
|
||||||
|
|
||||||
|
نکته: از `-exec ... {} +` برای اجرای گروهی استفاده کنید (بهتر از `\;`).
|
||||||
|
|
||||||
|
## تمرین کوتاه
|
||||||
|
- همهٔ فایلهای `.sh` را پیدا کنید و تعداد خطوط هرکدام را بشمارید.
|
||||||
|
- تمام فایلهای حجیمتر از ۱۰MB در Downloads را بیابید.
|
||||||
|
|
||||||
|
## نکات و مثالهای بیشتر
|
||||||
|
- ترکیب چند شرط:
|
||||||
|
|
||||||
|
```
|
||||||
|
find . -type f -name "*.log" -mtime -3 -size +1M
|
||||||
|
```
|
||||||
|
|
||||||
|
- فیلتر بر اساس دسترسیها و مالک:
|
||||||
|
|
||||||
|
```
|
||||||
|
find . -type f -perm 0644 -user $USER
|
||||||
|
```
|
||||||
|
|
||||||
|
- چاپ فقط نام فایل یا مسیر نسبی/مطلق:
|
||||||
|
|
||||||
|
```
|
||||||
|
find . -type f -printf "%f\n"
|
||||||
|
find . -type f -printf "%p\n"
|
||||||
|
```
|
||||||
|
|
||||||
|
- اجرا با `xargs` برای کارایی بیشتر:
|
||||||
|
|
||||||
|
```
|
||||||
|
find . -type f -name "*.txt" -print0 | xargs -0 wc -l
|
||||||
|
```
|
||||||
|
|
||||||
|
## خطاهای رایج
|
||||||
|
- استفاده از `-exec ... \;` برای تعداد زیادی فایل؛ در صورت امکان از `+` استفاده کنید.
|
||||||
|
- نداشتن نقلقول دور الگوها و گسترش ناخواسته توسط شل.
|
||||||
@@ -0,0 +1,50 @@
|
|||||||
|
# درسنامه ۲-۹: وایلدکاردها (Wildcards) در شل
|
||||||
|
|
||||||
|
وایلدکاردها برای انتخاب گروهی از فایلها مفیدند.
|
||||||
|
|
||||||
|
## الگوهای متداول
|
||||||
|
- `*` هر رشتهای (حتی خالی)
|
||||||
|
- `?` دقیقاً یک کاراکتر
|
||||||
|
- `[abc]` یکی از حروف داخل براکت
|
||||||
|
- `[0-9]` یک رقم در بازه
|
||||||
|
- آکلاد `{}` (Brace expansion) برای تولید الگوها
|
||||||
|
|
||||||
|
## مثالها
|
||||||
|
```
|
||||||
|
ls *.txt # همهٔ txt
|
||||||
|
rm -i *.tmp # حذف تعاملی فایلهای موقت
|
||||||
|
mv photo_??.jpg pics/ # فایلهایی با دو رقم
|
||||||
|
touch report_{v1,v2}.md # تولید دو فایل v1 و v2
|
||||||
|
mkdir -p logs/{app,db}/2024/{10,11}
|
||||||
|
```
|
||||||
|
|
||||||
|
نکته: قبل از دستورات مخرب مثل `rm` همیشه ابتدا الگو را با `ls` بررسی کنید.
|
||||||
|
|
||||||
|
## تمرین کوتاه
|
||||||
|
- چند فایل نمونه بسازید و با الگوها آنها را جابهجا یا حذف کنید.
|
||||||
|
|
||||||
|
## نکات و مثالهای بیشتر
|
||||||
|
- الگوهای ترکیبی و نفی:
|
||||||
|
|
||||||
|
```
|
||||||
|
ls *.log *.txt
|
||||||
|
ls *.[ch] # همهٔ .c و .h
|
||||||
|
ls !(tmp|bak) # نیازمند extglob: shopt -s extglob
|
||||||
|
```
|
||||||
|
|
||||||
|
- گسترش آکلاد برای بازهها:
|
||||||
|
|
||||||
|
```
|
||||||
|
touch file_{01..05}.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
- تست امن قبل از rm:
|
||||||
|
|
||||||
|
```
|
||||||
|
ls pattern* # بررسی نتیجهٔ الگو
|
||||||
|
rm -i pattern* # حذف تعاملی
|
||||||
|
```
|
||||||
|
|
||||||
|
## خطاهای رایج
|
||||||
|
- فراموشکردن فعالسازی extglob برای الگوهای پیشرفتهٔ `!()`.
|
||||||
|
- فرضگرفتن اینکه الگوها در نقلقول هم گسترش مییابند؛ داخل نقلقول معمولاً گسترش انجام نمیشود.
|
||||||
@@ -0,0 +1,43 @@
|
|||||||
|
# درسنامه ۲: ساختار کلی دستورات در لینوکس
|
||||||
|
|
||||||
|
پس از یادگیری دستورات سادهای مثل `pwd` و `cd`, وقت آن رسیده با ساختار عمومی دستورات در لینوکس آشنا شویم. بسیاری از فرمانها بدون گزینهها (Options) و آرگومانها (Arguments) کارایی محدودی دارند؛ بنابراین شناخت این اجزا برای استفادهٔ واقعی از محیط خط فرمان ضروری است.
|
||||||
|
|
||||||
|
## الگوی عمومی
|
||||||
|
|
||||||
|
```
|
||||||
|
COMMAND [OPTIONS] [ARGUMENTS]
|
||||||
|
```
|
||||||
|
|
||||||
|
- `COMMAND`: نام برنامهای که میخواهیم اجرا کنیم.
|
||||||
|
- `[OPTIONS]`: تنظیمات اختیاری که نحوهٔ اجرای برنامه را تغییر میدهند.
|
||||||
|
- `[ARGUMENTS]`: دادههایی که فرمان روی آنها عمل میکند.
|
||||||
|
|
||||||
|
**نکته:** لینوکس به بزرگی و کوچکی حروف حساس است؛ `ls`, `Ls` و `LS` سه فرمان متفاوت محسوب میشوند.
|
||||||
|
|
||||||
|
## بخش COMMAND
|
||||||
|
هر فرمان در واقع برنامهای است که هستهٔ سیستمعامل را برای انجام کاری مشخص فراخوانی میکند. مثال: `pwd` مسیر پوشهٔ فعلی را چاپ میکند.
|
||||||
|
|
||||||
|
## بخش OPTIONS
|
||||||
|
گزینهها رفتار فرمان را تغییر میدهند و معمولا با یک خط تیره (`-`) یا دو خط تیره (`--`) آغاز میشوند.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ pwd --help
|
||||||
|
```
|
||||||
|
|
||||||
|
فرمان بالا گزینهٔ `--help` را به `pwd` میدهد و راهنمای استفاده از آن را چاپ میکند.
|
||||||
|
|
||||||
|
## بخش ARGUMENTS
|
||||||
|
آرگومانها دادههایی هستند که فرمان روی آنها اعمال میشود. برای مثال:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ help pwd
|
||||||
|
```
|
||||||
|
|
||||||
|
در اینجا `help` فرمان است و `pwd` آرگومانی است که مشخص میکند کدام راهنما نمایش داده شود.
|
||||||
|
|
||||||
|
## مرور
|
||||||
|
- COMMAND اجباری است و دستور اصلی را تعیین میکند.
|
||||||
|
- OPTIONS رفتار فرمان را سفارشی میکنند و میتوانند صفر یا چند مورد باشند.
|
||||||
|
- ARGUMENTS ورودیهای عملیاتی هستند و تعدادشان بسته به فرمان متغیر است.
|
||||||
|
|
||||||
|
در درسنامهٔ بعدی، به سراغ فرمان `ls` میرویم و گزینههای رایج آن را بررسی میکنیم.
|
||||||
@@ -0,0 +1,52 @@
|
|||||||
|
# درسنامه ۳-۱: چرا Bash و اسکریپت؟
|
||||||
|
|
||||||
|
در این درس با مفهوم شِل (Shell)، Bash و اینکه «اسکریپت» دقیقا چیست آشنا میشویم و میبینیم چرا یادگرفتن Bash برای یک کاربر لینوکس (حتی در سطح مبتدی) بسیار مفید است.
|
||||||
|
|
||||||
|
## شل و Bash یعنی چه؟
|
||||||
|
- شِل برنامهای است که دستورات شما را در خط فرمان میگیرد و آنها را اجرا میکند.
|
||||||
|
- در بیشتر توزیعهای لینوکس، شل پیشفرض `bash` است.
|
||||||
|
- وقتی در ترمینال مینویسید:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ls
|
||||||
|
pwd
|
||||||
|
cd Documents
|
||||||
|
```
|
||||||
|
|
||||||
|
این دستورات توسط برنامهٔ `bash` دریافت و اجرا میشوند.
|
||||||
|
|
||||||
|
## اسکریپت Bash چیست؟
|
||||||
|
اسکریپت Bash در واقع یک «فایل متنی ساده» است که در آن چند دستور پشت سر هم نوشته شدهاند و Bash آنها را از بالا به پایین اجرا میکند؛ دقیقا مثل اینکه شما خودتان همان دستورات را یکییکی در ترمینال تایپ کنید.
|
||||||
|
|
||||||
|
مزیت اسکریپت:
|
||||||
|
- کارهای تکراری را فقط یکبار مینویسید و هر وقت لازم شد اجرا میکنید.
|
||||||
|
- میتوانید چندین دستور را با هم ترکیب کنید و مثل یک برنامهٔ کوچک در بیاورید.
|
||||||
|
- میتوانید به اسکریپت ورودی بدهید، روی آنها شرط بگذارید و خروجی تمیز بگیرید.
|
||||||
|
|
||||||
|
مثال ذهنی: فرض کنید هر روز باید این سه کار را انجام دهید:
|
||||||
|
|
||||||
|
1. وارد یک پوشهٔ خاص شوید.
|
||||||
|
2. از آن پوشه یک آرشیو `tar.gz` بگیرید.
|
||||||
|
3. آرشیو را در یک پوشهٔ بکآپ کپی کنید.
|
||||||
|
|
||||||
|
اگر این سه دستور را در یک فایل Bash قرار بدهید، هر روز فقط کافی است آن اسکریپت را اجرا کنید تا همهٔ کارها پشت سر هم انجام شوند.
|
||||||
|
|
||||||
|
## چه کارهایی را میشود با Bash انجام داد؟
|
||||||
|
چند نمونهٔ رایج:
|
||||||
|
- گرفتن بکآپ ساده از فایلها و پوشهها
|
||||||
|
- پاکسازی فایلهای موقت و لاگهای قدیمی
|
||||||
|
- اجرای چند برنامه پشت سر هم با تنظیمات مشخص
|
||||||
|
- آمادهسازی محیط یک پروژه (ساخت پوشهها، تنظیم مجوزها و ...)
|
||||||
|
|
||||||
|
در این فصل با مثالهای کوچک و ساده شروع میکنیم تا کمکم ذهن شما به شکل «برنامهنویسی با دستورات لینوکسی» عادت کند.
|
||||||
|
|
||||||
|
## تمرین کوتاه
|
||||||
|
- در یک برگه یا فایل متنی، سه کار تکراری که معمولا در ترمینال انجام میدهید را بنویسید؛ مثلا:
|
||||||
|
- ساختن یک پوشه
|
||||||
|
- رفتن داخل آن
|
||||||
|
- ساختن چند فایل خالی
|
||||||
|
- کنار هر کار، دستور مربوط به آن را بنویسید (`mkdir`, `cd`, `touch` و ...).
|
||||||
|
- به این فکر کنید که اگر این سه دستور پشت سر هم در یک فایل متنی باشند، چقدر راحتتر میتوانید آن کار را تکرار کنید.
|
||||||
|
|
||||||
|
در درس بعد، اولین اسکریپت Bash خود را میسازیم و آن را اجرا میکنیم.
|
||||||
|
|
||||||
@@ -0,0 +1,80 @@
|
|||||||
|
# درسنامه ۳-۲: ساخت اولین اسکریپت Bash
|
||||||
|
|
||||||
|
در این درس اولین اسکریپت Bash خود را میسازید. میبینید که اسکریپت، چیزی فراتر از یک فایل متنی ساده نیست که چند دستور داخل آن نوشته شده است.
|
||||||
|
|
||||||
|
## گام ۱: ساخت فایل اسکریپت
|
||||||
|
به یک دایرکتوری دلخواه (مثلا پوشهٔ خانگی خودتان) بروید:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
cd ~
|
||||||
|
```
|
||||||
|
|
||||||
|
سپس با یک ادیتور ساده مثل `nano` یک فایل جدید باز کنید:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
nano hello.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
نام فایل مهم نیست، اما استفاده از پسوند `.sh` کمک میکند راحت تشخیص دهید فایل یک اسکریپت است.
|
||||||
|
|
||||||
|
## گام ۲: اضافهکردن shebang و دستورات
|
||||||
|
در فایل `hello.sh` این خطوط را بنویسید:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
echo "Hello! This is my first Bash script."
|
||||||
|
```
|
||||||
|
|
||||||
|
توضیح:
|
||||||
|
- خط اول (`#!/bin/bash`) را *شبانگ* (Shebang) مینامند و به سیستم میگوید این فایل باید با برنامهٔ `bash` اجرا شود.
|
||||||
|
- خط دوم یک دستور معمولی `echo` است که یک متن را روی صفحه چاپ میکند.
|
||||||
|
|
||||||
|
## گام ۳: ذخیره و خروج از ادیتور
|
||||||
|
اگر از `nano` استفاده میکنید:
|
||||||
|
- برای ذخیره: `Ctrl + O` سپس Enter
|
||||||
|
- برای خروج: `Ctrl + X`
|
||||||
|
|
||||||
|
الان در دایرکتوری فعلی باید فایلی به نام `hello.sh` داشته باشید:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ls
|
||||||
|
```
|
||||||
|
|
||||||
|
## گام ۴: اجرای اسکریپت با bash
|
||||||
|
سادهترین روش برای اجرای اسکریپت، استفادهٔ مستقیم از دستور `bash` است:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
bash hello.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
اگر همه چیز درست باشد، باید پیام زیر را ببینید:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
سلام! این اولین اسکریپت Bash من است.
|
||||||
|
```
|
||||||
|
|
||||||
|
در این مرحله هنوز لازم نیست نگران مجوز اجرا (`chmod`) باشید؛ چون به `bash` میگویید این فایل را بخوان و اجرا کن.
|
||||||
|
|
||||||
|
## نکات مقدماتی مهم
|
||||||
|
- اسکریپت Bash **فایل متنی ساده** است؛ آن را با ادیتورهای متن (مثل `nano`, `vim`, `gedit`) بسازید، نه با برنامههایی مثل Word.
|
||||||
|
- بهتر است نام فایل کوتاه و معنیدار باشد؛ مثلا `backup.sh`, `setup.sh`, `welcome.sh`.
|
||||||
|
- برای تمرین، اسکریپتها را در پوشهای جدا (مثلا `~/scripts`) نگه دارید تا بعدا راحتتر آنها را پیدا کنید.
|
||||||
|
|
||||||
|
## تمرین کوتاه
|
||||||
|
۱. فایلی به نام `info.sh` بسازید و داخل آن این خطوط را بنویسید:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
echo "Hello!"
|
||||||
|
echo "Today I want to practice Bash."
|
||||||
|
```
|
||||||
|
|
||||||
|
۲. فایل را ذخیره کنید و با دستور زیر اجرا کنید:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
bash info.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
۳. خط دیگری اضافه کنید که تاریخ امروز را با دستور `date` چاپ کند و دوباره اسکریپت را اجرا کنید.
|
||||||
|
|
||||||
|
در درس بعد، یاد میگیریم چگونه در اسکریپت متغیر تعریف کنیم و از آنها استفاده کنیم.
|
||||||
@@ -0,0 +1,79 @@
|
|||||||
|
# درسنامه ۳-۳: متغیرها در Bash
|
||||||
|
|
||||||
|
در این درس با متغیرها در Bash آشنا میشویم. متغیر مثل یک «جعبهٔ نامدار» است که میتوانید داخل آن یک مقدار قرار دهید و بعدا از آن استفاده کنید.
|
||||||
|
|
||||||
|
## ساخت و استفاده از متغیر
|
||||||
|
برای ساخت متغیر در Bash از علامت `=` **بدون فاصله** استفاده میکنیم:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
NAME="Ali"
|
||||||
|
AGE=20
|
||||||
|
```
|
||||||
|
|
||||||
|
نکتههای مهم:
|
||||||
|
- بین نام متغیر، علامت `=` و مقدار **نباید** فاصله باشد.
|
||||||
|
`NAME = "Ali"` در Bash اشتباه است.
|
||||||
|
- نام متغیر معمولا با حروف بزرگ انگلیسی و بدون فاصله نوشته میشود (مثلا `USER_NAME`).
|
||||||
|
|
||||||
|
برای استفاده از مقدار متغیر، قبل از نام آن علامت `$` میگذاریم:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
echo $NAME
|
||||||
|
echo "You are $AGE years old."
|
||||||
|
```
|
||||||
|
|
||||||
|
## مثال: استفاده از متغیر در اسکریپت
|
||||||
|
فایلی به نام `welcome.sh` بسازید و این محتوا را در آن قرار دهید:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
NAME="Ali"
|
||||||
|
CITY="Mashhad"
|
||||||
|
|
||||||
|
echo "Hello $NAME!"
|
||||||
|
echo "I hope the weather in $CITY is nice for you :)"
|
||||||
|
```
|
||||||
|
|
||||||
|
سپس اجرا کنید:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
bash welcome.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
میتوانید مقادیر `NAME` و `CITY` را تغییر دهید و خروجی را دوباره ببینید.
|
||||||
|
|
||||||
|
## تغییر مقدار متغیر
|
||||||
|
مثل سایر زبانها، میتوانید مقدار متغیر را بعدا عوض کنید:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
COUNT=1
|
||||||
|
echo "COUNT is now: $COUNT"
|
||||||
|
|
||||||
|
COUNT=2
|
||||||
|
echo "COUNT is now: $COUNT"
|
||||||
|
```
|
||||||
|
|
||||||
|
Bash بهصورت پیشفرض نوع متغیر را (عدد، رشته و ...) سختگیرانه کنترل نمیکند؛ اما در این مرحله کافی است بدانید که میتوانید متن و عدد را در متغیر نگه دارید و نمایش دهید.
|
||||||
|
|
||||||
|
## نقلقولها و رشتهها
|
||||||
|
- اگر مقدار متغیر شامل فاصله باشد، آن را داخل کوتیشن قرار دهید:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
MESSAGE="سلام دنیا"
|
||||||
|
echo $MESSAGE
|
||||||
|
```
|
||||||
|
|
||||||
|
- وقتی متغیر را در یک رشته استفاده میکنید، بهتر است کل رشته را داخل `" "` قرار دهید تا Bash فاصلهها را درست مدیریت کند:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
NAME="Sara"
|
||||||
|
echo "Hello $NAME, welcome!"
|
||||||
|
```
|
||||||
|
|
||||||
|
## تمرین کوتاه
|
||||||
|
- اسکریپتی به نام `profile.sh` بسازید که در آن سه متغیر تعریف شده باشد: `NAME`, `AGE`, `CITY`.
|
||||||
|
- با استفاده از `echo` یک متن کوتاه چاپ کنید که این سه مقدار را در جملهای طبیعی نشان دهد.
|
||||||
|
- مقدارها را تغییر دهید و اسکریپت را دوباره اجرا کنید.
|
||||||
|
|
||||||
|
در درس بعد، یاد میگیریم چگونه به جای مقدارهای ثابت، از خود کاربر ورودی بگیریم.
|
||||||
@@ -0,0 +1,108 @@
|
|||||||
|
# درسنامه ۳-۴: گرفتن ورودی از کاربر و آرگومانها
|
||||||
|
|
||||||
|
در این درس یاد میگیریم اسکریپت فقط با مقدارهای ثابت کار نکند، بلکه از کاربر ورودی بگیرد یا هنگام اجرا از خط فرمان آرگومان دریافت کند.
|
||||||
|
|
||||||
|
## گرفتن ورودی تعاملی با read
|
||||||
|
برای گرفتن ورودی از کاربر از دستور `read` استفاده میکنیم.
|
||||||
|
|
||||||
|
شکل ساده:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
read NAME
|
||||||
|
echo "Hello $NAME!"
|
||||||
|
```
|
||||||
|
|
||||||
|
در این حالت، Bash منتظر میماند تا کاربر چیزی بنویسد و Enter بزند؛ مقدار وارد شده در متغیر `NAME` ذخیره میشود.
|
||||||
|
|
||||||
|
## نمایش پیام راهنما با -p
|
||||||
|
معمولا قبل از گرفتن ورودی، پیامی به کاربر نشان میدهیم تا بداند چه باید بنویسد. برای این کار از گزینهٔ `-p` استفاده میکنیم:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
read -p "اسم شما چیه؟ " NAME
|
||||||
|
echo "Welcome, $NAME!"
|
||||||
|
```
|
||||||
|
|
||||||
|
هنگام اجرا:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
bash ask_name.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
اسکریپت پیام را نمایش میدهد، منتظر ورودی میماند و سپس پاسخ را در خروجی استفاده میکند.
|
||||||
|
|
||||||
|
## استفاده از چند ورودی
|
||||||
|
میتوانیم چند بار `read` صدا بزنیم یا چند متغیر را همزمان پر کنیم:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
read -p "اسم شما؟ " NAME
|
||||||
|
read -p "شهری که توش زندگی میکنید؟ " CITY
|
||||||
|
|
||||||
|
echo "Hello $NAME from $CITY!"
|
||||||
|
```
|
||||||
|
|
||||||
|
یا به صورت یکجا:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
read -p "اسم و نام خانوادگی؟ " FIRST LAST
|
||||||
|
echo "Hello $FIRST $LAST"
|
||||||
|
```
|
||||||
|
|
||||||
|
## آرگومانهای خط فرمان ($1, $2, ...)
|
||||||
|
علاوه بر گرفتن ورودی هنگام اجرا، میتوانیم مقدارها را به صورت «آرگومان» هنگام صدا زدن اسکریپت بفرستیم.
|
||||||
|
|
||||||
|
- `"$1"` اولین آرگومان
|
||||||
|
- `"$2"` دومین آرگومان و به همین ترتیب
|
||||||
|
- `"$@"` همهٔ آرگومانها
|
||||||
|
|
||||||
|
مثال:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
NAME="$1"
|
||||||
|
echo "Hello $NAME!"
|
||||||
|
```
|
||||||
|
|
||||||
|
اگر این فایل را `hello_arg.sh` بنامید، هنگام اجرا:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
bash hello_arg.sh Ali
|
||||||
|
```
|
||||||
|
|
||||||
|
خروجی:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
سلام Ali!
|
||||||
|
```
|
||||||
|
|
||||||
|
اگر آرگومانی نفرستید، متغیر `NAME` خالی خواهد بود.
|
||||||
|
|
||||||
|
## ترکیب read و آرگومانها
|
||||||
|
یک الگوی سادهٔ رایج:
|
||||||
|
- اگر کاربر هنگام اجرا آرگومان فرستاد، از آن استفاده کن.
|
||||||
|
- اگر نه، از او سوال بپرس.
|
||||||
|
|
||||||
|
نمونهٔ ساده:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
if [ -z "$1" ]; then
|
||||||
|
read -p "اسم شما چیه؟ " NAME
|
||||||
|
else
|
||||||
|
NAME="$1"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Hello $NAME!"
|
||||||
|
```
|
||||||
|
|
||||||
|
در این مثال، `-z` یعنی «رشته خالی است».
|
||||||
|
|
||||||
|
## تمرین کوتاه
|
||||||
|
- اسکریپتی بنویسید که:
|
||||||
|
- اگر هنگام اجرا نام کاربر به عنوان آرگومان داده شده بود، مستقیم از آن استفاده کند.
|
||||||
|
- اگر آرگومان خالی بود، با `read -p` نام را از کاربر بپرسد.
|
||||||
|
- نسخهای دیگر بنویسید که هم نام و هم شهر را از کاربر بگیرد و در یک جمله نشان دهد.
|
||||||
|
|
||||||
|
در درس بعد، از همین ورودیها برای تصمیمگیری با استفاده از شرطها (`if`) استفاده میکنیم.
|
||||||
@@ -0,0 +1,87 @@
|
|||||||
|
# درسنامه ۳-۵: شرطها در Bash (if)
|
||||||
|
|
||||||
|
در این درس یاد میگیریم چگونه با استفاده از شرطها (`if`) در اسکریپت تصمیم بگیریم؛ مثلا اگر سن کاربر بالای ۱۸ بود یک پیام خاص و در غیر این صورت پیام دیگری نمایش دهیم.
|
||||||
|
|
||||||
|
## ساختار کلی if در Bash
|
||||||
|
ساختار پایهٔ یک شرط:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
if [ شرط ]
|
||||||
|
then
|
||||||
|
دستورات اگر شرط درست بود
|
||||||
|
else
|
||||||
|
دستورات اگر شرط نادرست بود
|
||||||
|
fi
|
||||||
|
```
|
||||||
|
|
||||||
|
نکتهها:
|
||||||
|
- `fi` همان `if` برعکس است و پایان بلوک شرطی را مشخص میکند.
|
||||||
|
- بین `[` و شرط و `]` باید فاصله بگذارید.
|
||||||
|
|
||||||
|
## مثال: بررسی سن کاربر
|
||||||
|
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
read -p "سن شما چند ساله است؟ " AGE
|
||||||
|
|
||||||
|
if [ "$AGE" -ge 18 ]
|
||||||
|
then
|
||||||
|
echo "You are an adult."
|
||||||
|
else
|
||||||
|
echo "You are not an adult yet."
|
||||||
|
fi
|
||||||
|
```
|
||||||
|
|
||||||
|
در اینجا:
|
||||||
|
- `-ge` یعنی «بزرگتر یا مساوی».
|
||||||
|
- از کوتیشن `" "` برای متغیر استفاده کردهایم تا اگر خالی بود، خطای عجیبی ندهد.
|
||||||
|
|
||||||
|
## مقایسهٔ عددی و متنی
|
||||||
|
چند عملگر عددی رایج:
|
||||||
|
- `-eq` مساوی
|
||||||
|
- `-ne` نامساوی
|
||||||
|
- `-gt` بزرگتر
|
||||||
|
- `-lt` کوچکتر
|
||||||
|
- `-ge` بزرگتر یا مساوی
|
||||||
|
- `-le` کوچکتر یا مساوی
|
||||||
|
|
||||||
|
مثال:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
if [ "$AGE" -lt 13 ]; then
|
||||||
|
echo "Child"
|
||||||
|
elif [ "$AGE" -lt 18 ]; then
|
||||||
|
echo "Teenager"
|
||||||
|
else
|
||||||
|
echo "Adult"
|
||||||
|
fi
|
||||||
|
```
|
||||||
|
|
||||||
|
برای مقایسهٔ رشتهای ساده:
|
||||||
|
- `[ "$NAME" = "Ali" ]` یا `[ "$NAME" != "Ali" ]`
|
||||||
|
|
||||||
|
## مثال: بررسی آرگومان
|
||||||
|
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
if [ -z "$1" ]; then
|
||||||
|
echo "Please provide a name as an argument."
|
||||||
|
echo "Example: bash script.sh Ali"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
NAME="$1"
|
||||||
|
echo "Hello $NAME!"
|
||||||
|
```
|
||||||
|
|
||||||
|
در اینجا:
|
||||||
|
- `-z "$1"` یعنی «آرگومان اول خالی است».
|
||||||
|
- با `exit 1` اسکریپت را با کد خطا خاتمه میدهیم (در این مرحله فقط بدانید که ۰ یعنی موفق، غیر از آن یعنی خطا).
|
||||||
|
|
||||||
|
## تمرین کوتاه
|
||||||
|
- اسکریپتی بنویسید که از کاربر سن را بپرسد و یکی از پیامهای «کودک»، «نوجوان»، «بزرگسال» را نمایش دهد.
|
||||||
|
- اسکریپتی بنویسید که یک عدد از کاربر بگیرد و بگوید زوج است یا فرد (راهنما: از عملگر `%` همراه با دستور `expr` یا `$(( ))` استفاده کنید؛ اگر هنوز با اینها آشنا نیستید، میتوانید این تمرین را برای بعد نگه دارید).
|
||||||
|
|
||||||
|
در درس بعد، با مجوزهای اجرایی (`chmod`) و روشهای مختلف اجرای اسکریپت آشنا میشویم.
|
||||||
@@ -0,0 +1,80 @@
|
|||||||
|
# درسنامه ۳-۶: مجوز اجرا و اجرای اسکریپت
|
||||||
|
|
||||||
|
در این درس یاد میگیریم چگونه به اسکریپت مجوز اجرایی بدهیم و آن را مثل یک برنامه اجرا کنیم. همچنین تفاوت اجرای اسکریپت با `bash` و اجرای مستقیم آن را میبینیم.
|
||||||
|
|
||||||
|
## بررسی مجوزهای یک فایل
|
||||||
|
برای دیدن مجوزهای فایل از `ls -l` استفاده میکنیم:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ls -l hello.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
خروجی نمونه:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
-rw-r--r-- 1 user user 50 Dec 1 10:00 hello.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
اگر در ستون اول کنار حروف `r` و `w` حرف `x` (execute) دیده نشود، یعنی فایل هنوز «اجرایی» نیست.
|
||||||
|
|
||||||
|
## دادن مجوز اجرایی با chmod
|
||||||
|
برای اینکه سیستم بداند این فایل را میتوان بهعنوان برنامه اجرا کرد، باید به آن مجوز اجرا بدهیم:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
chmod +x hello.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
حالا اگر دوباره `ls -l` بگیریم:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ls -l hello.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
چیزی شبیه این میبینیم:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
-rwxr-xr-x 1 user user 50 Dec 1 10:05 hello.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
حرف `x` نشان میدهد که فایل الان قابل اجراست.
|
||||||
|
|
||||||
|
## اجرای مستقیم اسکریپت (./script.sh)
|
||||||
|
بعد از دادن مجوز اجرا، میتوانیم فایل را مثل یک برنامه اجرا کنیم:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
./hello.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
علامت `./` یعنی «این فایل را از دایرکتوری فعلی اجرا کن». اگر فقط `hello.sh` را بنویسید، سیستم معمولا آن را پیدا نمیکند؛ چون دایرکتوری فعلی به طور پیشفرض در متغیر `PATH` نیست.
|
||||||
|
|
||||||
|
## اجرای اسکریپت با bash
|
||||||
|
روش دیگر، همان روشی است که قبلا استفاده کردیم:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
bash hello.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
تفاوتها:
|
||||||
|
- در روش `bash hello.sh` حتی اگر مجوز اجرا نداشته باشید، معمولا اسکریپت اجرا میشود؛ چون شما به `bash` میگویید این فایل متنی را بخوان و اجرا کن.
|
||||||
|
- در روش `./hello.sh` سیستم به مجوز `x` روی خود فایل نگاه میکند؛ اگر نباشد، خطای «Permission denied» میگیرید.
|
||||||
|
|
||||||
|
در عمل هر دو روش مفیدند؛ اما برای اسکریپتهایی که میخواهید مثل یک برنامهٔ مستقل استفاده کنید، دادن مجوز اجرا و استفاده از `./script.sh` رایجتر است.
|
||||||
|
|
||||||
|
## جمعبندی فصل تا اینجا
|
||||||
|
در این فصل (شروع برنامهنویسی Bash) تا این درس یاد گرفتید که:
|
||||||
|
- Bash شل رایج لینوکس است و اسکریپت Bash فایلی متنی حاوی مجموعهای از دستورات است.
|
||||||
|
- میتوانید اولین اسکریپت خود را با `#!/bin/bash` و چند دستور ساده بسازید و با `bash script.sh` اجرا کنید.
|
||||||
|
- متغیرها به شما اجازه میدهند مقادیر را با نام ذخیره کنید و در خروجی استفاده کنید.
|
||||||
|
- با `read` و آرگومانهای خط فرمان (`$1`, `$2`, ...) میتوانید از کاربر ورودی بگیرید.
|
||||||
|
- با ساختار `if` و عملگرهای مقایسهای، اسکریپتهای تعاملی و هوشمندتر بسازید.
|
||||||
|
- با `chmod +x` به اسکریپت مجوز اجرا میدهید و آن را با `./script.sh` بهعنوان یک برنامه اجرا میکنید.
|
||||||
|
|
||||||
|
## تمرین کوتاه
|
||||||
|
- اسکریپتی بنویسید که:
|
||||||
|
- ابتدا نام کاربر را (با آرگومان یا `read`) بگیرد.
|
||||||
|
- اگر نام خالی بود، پیام خطا بدهد و خارج شود.
|
||||||
|
- در غیر این صورت، یک پیام خوشامدگویی چاپ کند.
|
||||||
|
- به اسکریپت مجوز اجرا بدهید و آن را هم با `bash script.sh` و هم با `./script.sh` اجرا کنید و تفاوت را حس کنید.
|
||||||
|
|
||||||
|
در فصلهای بعدی با حلقهها، توابع و ساختارهای پیشرفتهتر کار خواهیم کرد تا بتوانید اسکریپتهای قویتری برای کارهای روزمرهٔ خود در لینوکس بسازید.
|
||||||
|
|
||||||
@@ -0,0 +1,136 @@
|
|||||||
|
# درسنامه ۳-۷: حلقهها در Bash (for و while)
|
||||||
|
|
||||||
|
در این درس با حلقهها در Bash آشنا میشویم. حلقهها به شما کمک میکنند یک یا چند دستور را چندین بار تکرار کنید؛ مثلا نمایش چند پیام پشت سر هم، پردازش لیستی از فایلها یا شمارش.
|
||||||
|
|
||||||
|
در Bash دو حلقهٔ پایه را یاد میگیریم:
|
||||||
|
- حلقهٔ `for`
|
||||||
|
- حلقهٔ `while`
|
||||||
|
|
||||||
|
## حلقه for روی یک لیست ساده
|
||||||
|
ساختار کلی:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
for ITEM in لیست_مقادیر
|
||||||
|
do
|
||||||
|
دستورات
|
||||||
|
done
|
||||||
|
```
|
||||||
|
|
||||||
|
مثال ساده:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
for NAME in Ali Sara John
|
||||||
|
do
|
||||||
|
echo "Hello $NAME!"
|
||||||
|
done
|
||||||
|
```
|
||||||
|
|
||||||
|
خروجی:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
Hello Ali!
|
||||||
|
Hello Sara!
|
||||||
|
Hello John!
|
||||||
|
```
|
||||||
|
|
||||||
|
## حلقه for روی اعداد
|
||||||
|
میتوانیم از گسترش آکلاد استفاده کنیم:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
for NUM in {1..5}
|
||||||
|
do
|
||||||
|
echo "Number: $NUM"
|
||||||
|
done
|
||||||
|
```
|
||||||
|
|
||||||
|
خروجی:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
Number: 1
|
||||||
|
Number: 2
|
||||||
|
Number: 3
|
||||||
|
Number: 4
|
||||||
|
Number: 5
|
||||||
|
```
|
||||||
|
|
||||||
|
## حلقه for روی فایلها
|
||||||
|
حلقههای `for` برای کار با مجموعهای از فایلها بسیار مفیدند:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
for FILE in *.txt
|
||||||
|
do
|
||||||
|
echo "Processing file: $FILE"
|
||||||
|
done
|
||||||
|
```
|
||||||
|
|
||||||
|
در این مثال، اسکریپت همهٔ فایلهای `*.txt` در دایرکتوری فعلی را لیست میکند و برای هرکدام یک پیام نمایش میدهد.
|
||||||
|
|
||||||
|
## حلقه while — تا وقتی شرط برقرار است
|
||||||
|
حلقهٔ `while` یک بلوک کد را تا زمانی که شرط درست است تکرار میکند.
|
||||||
|
|
||||||
|
ساختار کلی:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
while [ شرط ]
|
||||||
|
do
|
||||||
|
دستورات
|
||||||
|
done
|
||||||
|
```
|
||||||
|
|
||||||
|
مثال شمارش:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
COUNT=1
|
||||||
|
|
||||||
|
while [ "$COUNT" -le 3 ]
|
||||||
|
do
|
||||||
|
echo "Loop iteration: $COUNT"
|
||||||
|
COUNT=$((COUNT + 1))
|
||||||
|
done
|
||||||
|
```
|
||||||
|
|
||||||
|
خروجی:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
Loop iteration: 1
|
||||||
|
Loop iteration: 2
|
||||||
|
Loop iteration: 3
|
||||||
|
```
|
||||||
|
|
||||||
|
## حلقه while برای گرفتن ورودی تا شرط خاص
|
||||||
|
یک الگوی رایج: از کاربر ورودی بگیریم تا زمانی که یک مقدار خاص (مثلا `exit`) وارد کند.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
while true
|
||||||
|
do
|
||||||
|
read -p "Type a word (or 'exit' to quit): " WORD
|
||||||
|
|
||||||
|
if [ "$WORD" = "exit" ]; then
|
||||||
|
echo "Goodbye!"
|
||||||
|
break
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "You typed: $WORD"
|
||||||
|
done
|
||||||
|
```
|
||||||
|
|
||||||
|
در این مثال:
|
||||||
|
- `while true` یعنی حلقه همیشه ادامه دارد، مگر اینکه با `break` از آن خارج شویم.
|
||||||
|
- اگر کاربر `exit` بنویسد، پیام خداحافظی چاپ میشود و حلقه با `break` تمام میشود.
|
||||||
|
|
||||||
|
## تمرین کوتاه
|
||||||
|
- اسکریپتی بنویسید که با استفاده از حلقهٔ `for` اعداد ۱ تا ۱۰ را چاپ کند.
|
||||||
|
- اسکریپتی بنویسید که با `while` از کاربر نام بگیرد و هر بار پیام `"Hello NAME!"` را چاپ کند تا وقتی که کاربر فقط Enter خالی بزند؛ در آن لحظه اسکریپت باید پایان یابد.
|
||||||
|
|
||||||
|
در درس بعد، یاد میگیریم چگونه با استفاده از `case` و حلقهها، منوی متنی ساده بسازیم.
|
||||||
|
|
||||||
@@ -0,0 +1,95 @@
|
|||||||
|
# درسنامه ۳-۸: ساخت منوی ساده با case و حلقه
|
||||||
|
|
||||||
|
در این درس با دستور `case` در Bash آشنا میشویم و از آن برای ساخت یک منوی متنی ساده استفاده میکنیم. منوها باعث میشوند اسکریپت شما برای کاربرانی که فقط گزینه انتخاب میکنند، راحتتر قابل استفاده باشد.
|
||||||
|
|
||||||
|
## دستور case برای چند حالت مختلف
|
||||||
|
ساختار کلی:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
case مقدار in
|
||||||
|
الگو۱)
|
||||||
|
دستورات
|
||||||
|
;;
|
||||||
|
الگو۲)
|
||||||
|
دستورات
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
دستورات پیشفرض
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
```
|
||||||
|
|
||||||
|
مثال ساده:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
read -p "Enter a letter (a/b): " LETTER
|
||||||
|
|
||||||
|
case "$LETTER" in
|
||||||
|
a)
|
||||||
|
echo "You chose option A."
|
||||||
|
;;
|
||||||
|
b)
|
||||||
|
echo "You chose option B."
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Unknown option."
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
```
|
||||||
|
|
||||||
|
## ساخت منوی متنی ساده
|
||||||
|
حالا `case` را با یک حلقهٔ `while` ترکیب میکنیم تا منویی بسازیم که چند بار نمایش داده میشود تا وقتی کاربر انتخاب کند خارج شود.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
while true
|
||||||
|
do
|
||||||
|
echo "==== Simple Menu ===="
|
||||||
|
echo "1) Show current date"
|
||||||
|
echo "2) Show current directory"
|
||||||
|
echo "3) List files"
|
||||||
|
echo "4) Exit"
|
||||||
|
|
||||||
|
read -p "Choose an option [1-4]: " CHOICE
|
||||||
|
|
||||||
|
case "$CHOICE" in
|
||||||
|
1)
|
||||||
|
date
|
||||||
|
;;
|
||||||
|
2)
|
||||||
|
pwd
|
||||||
|
;;
|
||||||
|
3)
|
||||||
|
ls
|
||||||
|
;;
|
||||||
|
4)
|
||||||
|
echo "Exiting... Bye!"
|
||||||
|
break
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Invalid option, please try again."
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
echo "" # یک خط خالی برای خوانایی
|
||||||
|
done
|
||||||
|
```
|
||||||
|
|
||||||
|
در این مثال:
|
||||||
|
- منو داخل یک حلقهٔ `while true` نمایش داده میشود.
|
||||||
|
- با `case` بر اساس گزینهٔ انتخابی، دستور مناسب اجرا میشود.
|
||||||
|
- هنگام انتخاب گزینهٔ ۴، پیام خداحافظی چاپ شده و با `break` از حلقه خارج میشویم.
|
||||||
|
|
||||||
|
## نکات کاربردی
|
||||||
|
- میتوانید برای هر گزینه، یک تابع جداگانه بنویسید (در درس بعد توابع را میبینیم).
|
||||||
|
- برای جلوگیری از شلوغ شدن خروجی، میتوانید بعد از اجرای هر گزینه با `read -p "Press Enter to continue..."` مکث کوتاه ایجاد کنید.
|
||||||
|
|
||||||
|
## تمرین کوتاه
|
||||||
|
- منویی بسازید که گزینههایی مثل «نمایش زمان»، «نمایش فضای آزاد دیسک (با دستور `df -h`)» و «نمایش ۵ خط آخر یک فایل لاگ» داشته باشد.
|
||||||
|
- گزینهای اضافه کنید که نام کاربر را بگیرد و پیام `"Hello NAME!"` نمایش دهد.
|
||||||
|
|
||||||
|
در درس بعد، با توابع در Bash آشنا میشویم تا بتوانیم همین منو را تمیزتر و خواناتر بنویسیم.
|
||||||
|
|
||||||
@@ -0,0 +1,134 @@
|
|||||||
|
# درسنامه ۳-۹: توابع در Bash و تمیزکردن اسکریپتها
|
||||||
|
|
||||||
|
در این درس با توابع (functions) در Bash آشنا میشویم. توابع به شما کمک میکنند بخشهای تکراری اسکریپت را در یک جای مشخص بنویسید و هر جا لازم شد آنها را «صدا بزنید».
|
||||||
|
|
||||||
|
## تعریف تابع در Bash
|
||||||
|
دو شکل رایج برای تعریف تابع:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
my_function() {
|
||||||
|
دستورات
|
||||||
|
}
|
||||||
|
|
||||||
|
# یا
|
||||||
|
|
||||||
|
function my_function {
|
||||||
|
دستورات
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
بعد از تعریف تابع، میتوانید آن را مثل یک دستور صدا بزنید:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
my_function
|
||||||
|
```
|
||||||
|
|
||||||
|
## مثال سادهٔ تابع
|
||||||
|
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
greet() {
|
||||||
|
echo "Hello from inside the function!"
|
||||||
|
}
|
||||||
|
|
||||||
|
echo "Before calling greet"
|
||||||
|
greet
|
||||||
|
echo "After calling greet"
|
||||||
|
```
|
||||||
|
|
||||||
|
خروجی:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
Before calling greet
|
||||||
|
Hello from inside the function!
|
||||||
|
After calling greet
|
||||||
|
```
|
||||||
|
|
||||||
|
## تابع با آرگومان
|
||||||
|
همانطور که اسکریپت میتواند آرگومان بگیرد (`$1`, `$2` و ...)، تابع هم میتواند آرگومان بگیرد:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
greet() {
|
||||||
|
NAME="$1"
|
||||||
|
echo "Hello $NAME!"
|
||||||
|
}
|
||||||
|
|
||||||
|
greet "Ali"
|
||||||
|
greet "Sara"
|
||||||
|
```
|
||||||
|
|
||||||
|
در این مثال:
|
||||||
|
- داخل تابع، آرگومان اول را با `$1` میگیریم.
|
||||||
|
- هر بار که تابع را صدا میزنیم، یک نام جدید میدهیم.
|
||||||
|
|
||||||
|
## مرتبکردن منو با توابع
|
||||||
|
حالا منوی درس قبلی را کمی تمیزتر میکنیم:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
show_date() {
|
||||||
|
date
|
||||||
|
}
|
||||||
|
|
||||||
|
show_dir() {
|
||||||
|
pwd
|
||||||
|
}
|
||||||
|
|
||||||
|
list_files() {
|
||||||
|
ls
|
||||||
|
}
|
||||||
|
|
||||||
|
show_menu() {
|
||||||
|
echo "==== Simple Menu ===="
|
||||||
|
echo "1) Show current date"
|
||||||
|
echo "2) Show current directory"
|
||||||
|
echo "3) List files"
|
||||||
|
echo "4) Exit"
|
||||||
|
}
|
||||||
|
|
||||||
|
while true
|
||||||
|
do
|
||||||
|
show_menu
|
||||||
|
read -p "Choose an option [1-4]: " CHOICE
|
||||||
|
|
||||||
|
case "$CHOICE" in
|
||||||
|
1) show_date ;;
|
||||||
|
2) show_dir ;;
|
||||||
|
3) list_files ;;
|
||||||
|
4)
|
||||||
|
echo "Exiting... Bye!"
|
||||||
|
break
|
||||||
|
;;
|
||||||
|
*)
|
||||||
|
echo "Invalid option, please try again."
|
||||||
|
;;
|
||||||
|
esac
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
done
|
||||||
|
```
|
||||||
|
|
||||||
|
در این نسخه:
|
||||||
|
- هر کار اصلی (نمایش تاریخ، دایرکتوری فعلی، لیست فایلها) در یک تابع جداگانه است.
|
||||||
|
- تابع `show_menu` تنها مسئول چاپ منو است.
|
||||||
|
- حلقهٔ اصلی تمیزتر و خواناتر شده است.
|
||||||
|
|
||||||
|
## نکات و عادتهای خوب
|
||||||
|
- برای اسکریپتهای طولانی، توابع را معمولاً در ابتدای فایل تعریف میکنند و سپس «بخش اصلی برنامه» (main) را پایین مینویسند.
|
||||||
|
- نام توابع را واضح انتخاب کنید؛ مثلا `backup_project`, `setup_env`, `clean_logs`.
|
||||||
|
- اگر تابع نیاز به ورودی دارد، آرگومانها را بهصورت منظم (`$1`, `$2`, ...) در ابتدای تابع بخوانید و در صورت نیاز روی آنها بررسی (validation) انجام دهید.
|
||||||
|
|
||||||
|
## تمرین کوتاه
|
||||||
|
- منوی درس قبل را طوری بازنویسی کنید که:
|
||||||
|
- برای هر گزینه یک تابع مشخص داشته باشد (مثلا `show_disk_usage`, `show_log_tail`).
|
||||||
|
- یک تابع `pause` تعریف کنید که بعد از هر عملیات، با `read -p "Press Enter to continue..."` منتظر Enter بماند.
|
||||||
|
- اسکریپتی بنویسید که:
|
||||||
|
- تابعی به نام `greet_user` داشته باشد؛ این تابع اگر آرگومان داشت از آن بهعنوان نام استفاده کند، و اگر نه، با `read` از کاربر نام را بپرسد.
|
||||||
|
- سپس پیام `"Hello NAME!"` را چاپ کند.
|
||||||
|
|
||||||
|
با این درس، پایههای اصلی اسکریپتنویسی Bash را در حد مبتدی یاد گرفتهاید: متغیر، ورودی، شرط، حلقه، منو و تابع. در فصلهای بعدی میتوانیم سراغ مباحث پیشرفتهتر مثل مدیریت خطا، کار با فایلهای تنظیمات و ابزارهای قدرتمندتر برویم.
|
||||||
|
|
||||||
@@ -0,0 +1,99 @@
|
|||||||
|
# درسنامه ۳: دستور `ls`
|
||||||
|
|
||||||
|
دستور `ls` مخفف *list* است و محتویات یک دایرکتوری را نمایش میدهد. اگر هیچ گزینه یا آرگومانی همراه آن نباشد، فایلها و پوشههای دایرکتوری فعلی را به صورت مرتبشدهٔ الفبایی نشان میدهد.
|
||||||
|
|
||||||
|
## اجرای ساده
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ ls
|
||||||
|
Documents Downloads Pictures README.md
|
||||||
|
```
|
||||||
|
|
||||||
|
در ترمینال گنو/لینوکس (مثلا Ubuntu) رنگها معنا دارند: دایرکتوریها معمولا به رنگ آبی، فایلهای اجرایی به سبز، آرشیوها به قرمز و فایلهای معمولی به سفید نشان داده میشوند. تم رنگی قابل سفارشیسازی است اما ایدهٔ کلی تفکیک نوع فایل با رنگ ثابت است.
|
||||||
|
|
||||||
|
## گزینهٔ `-t`
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ ls -t
|
||||||
|
report.txt log.txt archive.tar notes.md
|
||||||
|
```
|
||||||
|
|
||||||
|
نتیجه بر پایهٔ زمان آخرین تغییر (Modification Time) مرتب میشود و جدیدترین آیتمها ابتدا میآیند. ترکیب این گزینه با گزینههای دیگر (مانند `-l`) اطلاعات کاملتری فراهم میکند.
|
||||||
|
|
||||||
|
## گزینهٔ `-l`
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ ls -l
|
||||||
|
-rw-r--r-- 1 user user 842 Jan 18 10:22 notes.md
|
||||||
|
-rw-r--r-- 1 user user 12560 Jan 15 22:41 log.txt
|
||||||
|
-rw-r--r-- 1 user user 2048 Jan 12 09:05 report.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
خروجی «لیست طولانی» شامل ستونهایی برای مجوزها، تعداد لینکهای سخت، مالک، گروه، اندازه فایل (بر حسب بایت)، مهر زمانی آخرین تغییر و نام فایل است. این شکل برای بررسی دقیق دسترسیها و ابعاد فایلها بسیار مفید است.
|
||||||
|
|
||||||
|
## گزینهٔ `-a`
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ ls -a
|
||||||
|
. .. .bashrc .cache Documents Downloads README.md
|
||||||
|
```
|
||||||
|
|
||||||
|
آیتمهایی که نامشان با نقطه (`.`) شروع میشود، به طور پیشفرض مخفی هستند. با `-a` تمام فایلها و دایرکتوریها نمایش داده میشوند. در این خروجی دو ورودی ویژه میبینیم:
|
||||||
|
|
||||||
|
- `.`: دایرکتوری فعلی
|
||||||
|
- `..`: دایرکتوری والد
|
||||||
|
|
||||||
|
برای بازگشت به والد از دستور `cd ..` استفاده کنید و حتما پس از جابهجایی با `pwd` مسیر جدید را بررسی کنید.
|
||||||
|
|
||||||
|
## گزینهٔ `-r`
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ ls -r
|
||||||
|
notes.md log.txt report.txt archive.tar
|
||||||
|
```
|
||||||
|
|
||||||
|
نتایج در ترتیب معکوس نمایش داده میشوند. این گزینه با سایر گزینهها نیز قابل ترکیب است. دقت کنید که `-r` با حرف کوچک تنها ترتیب را معکوس میکند، در حالیکه `-R` (حرف بزرگ) رفتاری کاملا متفاوت دارد: محتوای دایرکتوری فعلی و تمام زیردایرکتوریها را به صورت بازگشتی فهرست میکند.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ ls -R
|
||||||
|
.:
|
||||||
|
Documents Downloads Pictures
|
||||||
|
|
||||||
|
./Documents:
|
||||||
|
report.txt summary.md
|
||||||
|
```
|
||||||
|
|
||||||
|
## ترکیب گزینهها
|
||||||
|
|
||||||
|
گزینهها را میتوان جداگانه یا ترکیبی نوشت:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ ls -l -t
|
||||||
|
$ ls -lt
|
||||||
|
```
|
||||||
|
|
||||||
|
هر دو فرمان بالا خروجی لیست طولانی را بر اساس زمان تغییر مرتب میکنند. افزودن `-r` آن را معکوس میکند:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ ls -ltr
|
||||||
|
```
|
||||||
|
|
||||||
|
این ترکیب برای دیدن قدیمیترین فایلها در ابتدا کاربردی است.
|
||||||
|
|
||||||
|
## گزینهٔ `-h`
|
||||||
|
|
||||||
|
خروجی `-l` اندازه فایل را بر حسب بایت نشان میدهد. برای نمایش اندازه به صورت قابلخواندن (مانند KB، MB یا GB) از `-h` استفاده کنید. این گزینه را معمولا همراه `-l` به کار میبرند:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ ls -lh
|
||||||
|
-rw-r--r-- 1 user user 2.0K Jan 18 10:22 notes.md
|
||||||
|
-rw-r--r-- 1 user user 12K Jan 15 22:41 log.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
## جمعبندی
|
||||||
|
|
||||||
|
- `ls` ابزار اصلی پیمایش سریع در ساختار دایرکتوری است.
|
||||||
|
- گزینههای `-t`, `-l`, `-a`, `-r`, `-R`, `-h` رفتار آن را برای نیازهای مختلف تغییر میدهند.
|
||||||
|
- میتوانید گزینهها را ترکیب کنید تا خروجی مناسب سناریوی خود را بسازید؛ مثلا `ls -alh` برای دیدن همهٔ فایلها با جزئیات کامل و اندازهٔ خوانا.
|
||||||
|
|
||||||
|
در درسنامهٔ بعدی مفاهیم تکمیلی پیمایش و گزینههای پیشرفتهٔ بیشتری را خواهیم دید.
|
||||||
@@ -0,0 +1,36 @@
|
|||||||
|
# درسنامه ۴: مدیریت تاریخچه و صفحهٔ ترمینال
|
||||||
|
|
||||||
|
## پاککردن صفحهٔ ترمینال
|
||||||
|
برای خالی کردن صفحهٔ ترمینال میتوانید از ترکیب کلیدی `Ctrl + L` استفاده کنید. این میانبر در اکثر شبیهسازهای ترمینال لینوکسی عمل میکند و معادل اجرای دستور `clear` است.
|
||||||
|
|
||||||
|
## مشاهدهٔ تاریخچهٔ دستورات
|
||||||
|
ترمینال Bash فهرستی از فرمانهایی که اجرا کردهاید نگه میدارد. دستور `history` این فهرست را نمایش میدهد و شمارهٔ هر فرمان را کنار آن چاپ میکند.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ history
|
||||||
|
1 pwd
|
||||||
|
2 ls -l
|
||||||
|
3 git status
|
||||||
|
4 history
|
||||||
|
```
|
||||||
|
|
||||||
|
## محدود کردن تعداد خطوط خروجی
|
||||||
|
برای دیدن فقط چند فرمان اخیر، عدد مورد نظر را پس از دستور `history` وارد کنید. مثال زیر پنج فرمان آخر را نشان میدهد:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ history 5
|
||||||
|
8 python main.py
|
||||||
|
9 ls -a
|
||||||
|
10 cat README.md
|
||||||
|
11 mkdir docs
|
||||||
|
12 history 5
|
||||||
|
```
|
||||||
|
|
||||||
|
## پاککردن تاریخچهٔ دستورات
|
||||||
|
اگر میخواهید تاریخچهٔ فعلی را پاک کنید، از گزینهٔ `-c` استفاده کنید:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ history -c
|
||||||
|
```
|
||||||
|
|
||||||
|
به یاد داشته باشید که Bash نسخهای از تاریخچه را در فایل `~/.bash_history` هم نگه میدارد و پس از بستن جلسهٔ ترمینال، آن را بهروزرسانی میکند. برای حذف کامل سابقه، باید هم دستور بالا را اجرا کنید و هم در صورت نیاز فایل تاریخچه را نیز پاک یا ویرایش کنید.
|
||||||
@@ -0,0 +1,45 @@
|
|||||||
|
# درسنامه ۵: ساخت و حذف دایرکتوریها با `mkdir` و `rmdir`
|
||||||
|
|
||||||
|
## ایجاد دایرکتوری با `mkdir`
|
||||||
|
دستور `mkdir` (Make Directory) برای ایجاد پوشههای جدید استفاده میشود.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ mkdir khorasan
|
||||||
|
```
|
||||||
|
|
||||||
|
### ایجاد چند دایرکتوری همزمان
|
||||||
|
میتوانید چند نام را پشت سر هم بیاورید تا همگی در دایرکتوری فعلی ساخته شوند.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ mkdir a b c
|
||||||
|
```
|
||||||
|
|
||||||
|
### ایجاد دایرکتوریهای تودرتو با `-p`
|
||||||
|
گزینهٔ `-p` مسیرهای میانی را در صورت نبودن ایجاد میکند و نیازی به ساخت مرحلهای نیست.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ mkdir -p a/inside-a/inside-inside-a
|
||||||
|
```
|
||||||
|
|
||||||
|
## حذف دایرکتوری خالی با `rmdir`
|
||||||
|
دستور `rmdir` (Remove Directory) تنها دایرکتوریهای خالی را حذف میکند.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ rmdir khorasan
|
||||||
|
```
|
||||||
|
|
||||||
|
اگر پوشه خالی نباشد خطای «Directory not empty» دریافت میکنید.
|
||||||
|
|
||||||
|
## حذف سلسلهای با `rmdir -p`
|
||||||
|
برای حذف زنجیرهای از دایرکتوریهای خالی میتوانید مسیر کامل را همراه گزینهٔ `-p` بدهید تا والدهای خالی نیز حذف شوند.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ mkdir -p a/b/c
|
||||||
|
$ rmdir -p a/b/c
|
||||||
|
```
|
||||||
|
|
||||||
|
دستور بالا ابتدا `c` را حذف میکند و سپس اگر `b` و `a` خالی باشند، آنها را نیز پاک میکند. این روش معادل اجرای متوالی `rmdir a/b/c`, سپس `rmdir a/b`, و در نهایت `rmdir a` است.
|
||||||
|
|
||||||
|
## نکات تکمیلی
|
||||||
|
- `mkdir` در صورت وجود دایرکتوری همنام خطا میدهد؛ گزینهٔ `-p` با جلوگیری از خطا، تنها مسیرهای غایب را میسازد.
|
||||||
|
- برای حذف دایرکتوریهای دارای محتوا باید از ابزارهایی مثل `rm -r` استفاده شود که در درسهای بعدی بررسی میکنیم.
|
||||||
@@ -0,0 +1,52 @@
|
|||||||
|
# درسنامه ۶: ساخت فایل و نمایش محتوا با `touch` و `cat`
|
||||||
|
|
||||||
|
## ساخت فایل خالی با `touch`
|
||||||
|
دستور `touch` رایجترین راه برای ایجاد فایل خالی است. اگر فایل از قبل وجود داشته باشد، زمان ویرایش آن بهروزرسانی میشود و محتوای داخل آن بدون تغییر باقی میماند.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ touch notes.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
برای ساخت چند فایل به صورت همزمان کافی است نام فایلها را پشت سر هم بنویسید:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ touch todo.txt ideas.md draft.sh
|
||||||
|
```
|
||||||
|
|
||||||
|
یکی از کاربردهای دیگر `touch`، ایجاد فایلهای نمونه برای تمرین است؛ مثلا اگر قصد دارید اسکریپتهای پوسته بنویسید، میتوانید ساختار پوشه و فایل مورد نیاز را از ابتدا ایجاد کنید.
|
||||||
|
|
||||||
|
## نمایش سریع محتوا با `cat`
|
||||||
|
دستور `cat` مخفف *concatenate* است. سادهترین کاربرد آن چاپ محتوای فایل روی خروجی استاندارد است تا بدون باز کردن ویرایشگر، بتوانید متن فایل را ببینید.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ cat todo.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
اگر فایل طولانی باشد، بهتر است آن را به دستورات دیگری مثل `less` یا `head` پایپ کنید تا کنترل بیشتری روی پیمایش داشته باشید؛ با این حال برای فایلهای کوتاه یا یادداشتهای روزمره، `cat` بسیار سریع و راحت است.
|
||||||
|
|
||||||
|
## ایجاد فایل متنی با `cat` و تغییر مسیر
|
||||||
|
به کمک `cat` و عملگر تغییر مسیر (`>`)، میتوانید فایلی بسازید و همان لحظه متن مورد نظر را داخل آن بنویسید. بعد از اتمام تایپ، با فشردن `Ctrl + D` (در سیستمهای مبتنی بر Linux) ورودی به پایان میرسد و فایل ذخیره میشود.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ cat > ideas.txt
|
||||||
|
اولین ایده
|
||||||
|
دومین ایده
|
||||||
|
```
|
||||||
|
|
||||||
|
برای جلوگیری از بازنویسی کل فایل، از عملگر `>>` استفاده کنید تا متن جدید به انتهای فایل اضافه شود:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ cat >> ideas.txt
|
||||||
|
ایدهٔ سوم
|
||||||
|
```
|
||||||
|
|
||||||
|
## ترکیب `touch` و `cat`
|
||||||
|
در بسیاری از سناریوها، ابتدا فایل را با `touch` میسازیم و سپس با `cat`، `nano` یا هر ویرایشگر دیگری محتوا را وارد میکنیم. این ترکیب در اسکریپت کردن نیز کاربرد دارد؛ مثلا ایجاد یک فایل پیکربندی خالی و پر کردن آن در مراحل بعدی.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ touch config.ini
|
||||||
|
$ cat config.ini
|
||||||
|
# خروجی: فایل خالی است و چیزی دیده نمیشود.
|
||||||
|
```
|
||||||
|
|
||||||
|
اگر اشتباهی فایل ایجاد شد، میتوانید با `rm` آن را حذف کنید یا از همان ابتدا نام صحیح و مسیر دقیق را تعیین کنید تا نیاز به جابهجایی دوباره نباشد.
|
||||||
@@ -0,0 +1,44 @@
|
|||||||
|
# درسنامه ۷: مدیریت فایلها با `cp`، `mv` و `rm`
|
||||||
|
|
||||||
|
## کپی کردن فایلها با `cp`
|
||||||
|
دستور `cp` (Copy) برای ایجاد نسخهٔ جدید از فایل یا دایرکتوری به کار میرود. شکل سادهٔ آن دو آرگومان میگیرد: منبع و مقصد.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ cp report.txt report-backup.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
برای نگه داشتن متادیتا (مانند مالکیت و زمان ویرایش)، از گزینهٔ `-p` یا برای گزارش فرایند از `-v` استفاده کنید. اگر قصد کپی یک دایرکتوری کامل را دارید، گزینهٔ `-r` یا `-R` ضروری است.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ cp -rp src/ src-backup/
|
||||||
|
```
|
||||||
|
|
||||||
|
## جابهجایی و تغییر نام با `mv`
|
||||||
|
دستور `mv` (Move) فایل یا دایرکتوری را به مکان جدید منتقل میکند. اگر مقصد یک نام جدید در همان مسیر باشد، در عمل نام فایل عوض میشود.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ mv draft.txt final.txt
|
||||||
|
$ mv final.txt archive/
|
||||||
|
```
|
||||||
|
|
||||||
|
برای جلوگیری از بازنویسی ناخواسته، گزینهٔ `-i` قبل از جایگزینی فایل مقصد از شما تأیید میگیرد و `-n` اجازهٔ بازنویسی نمیدهد. گزینهٔ `-v` هم گزارش مختصر از عملیات را چاپ میکند.
|
||||||
|
|
||||||
|
## حذف فایلها و دایرکتوریها با `rm`
|
||||||
|
دستور `rm` (Remove) فایلها را بدون انتقال به سطل زباله حذف میکند؛ بنابراین قبل از اجرا، نام و مسیر را با دقت بررسی کنید.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ rm todo.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
برای حذف دایرکتوری و محتویات آن باید از `rm -r` استفاده کنید. ترکیب `-r` و `-i` به صورت بازگشتی قبل از پاک کردن هر مورد از شما سؤال میپرسد و ریسک حذف اشتباهی را کاهش میدهد.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ rm -ri old-project/
|
||||||
|
```
|
||||||
|
|
||||||
|
اگر حذف حتمی است و میخواهید از تأیید گرفتن صرفنظر کنید، گزینهٔ `-f` (force) این کار را انجام میدهد؛ اما تنها زمانی از آن استفاده کنید که مطمئن هستید فایل یا دایرکتوری در فهرست درست قرار دارد.
|
||||||
|
|
||||||
|
## نکات تکمیلی
|
||||||
|
- قبل از اجرای `rm -r` روی مسیرهای مهم، با `ls` یا `tree` محتوا را مرور کنید.
|
||||||
|
- برای ایجاد آرشیو و جلوگیری از حذف تصادفی، بهتر است ابتدا با `cp` نسخهٔ پشتیبان بگیرید.
|
||||||
|
- ابزارهای مدرن مانند `trash-cli` امکان بازیابی فایلها را فراهم میکنند، اما در این دوره روی ابزارهای پایه و رفتار کلاسیک `rm` تمرکز داریم.
|
||||||
@@ -0,0 +1,41 @@
|
|||||||
|
# درسنامه ۸: مستندات دستورات و یادگیری عمیق در لینوکس
|
||||||
|
|
||||||
|
## صفحات راهنما با `man`
|
||||||
|
دستور `man` (Manual) مرجع اصلی برای مطالعهٔ جزئیات هر فرمان است. پس از اجرا، صفحهٔ مستندات در یک محیط مشابه `less` باز میشود که میتوانید آن را با کلیدهای جهت یا فاصله ورق بزنید و با `q` خارج شوید.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ man cp
|
||||||
|
```
|
||||||
|
|
||||||
|
ساختار صفحهٔ `man` معمولاً شامل بخشهای NAME، SYNOPSIS، DESCRIPTION و مثالها است. به یاد داشته باشید که برخی برنامهها در بخش SEE ALSO به ابزارهای مرتبط اشاره میکنند که برای گسترش دانش بسیار مفید است.
|
||||||
|
|
||||||
|
## کمک سریع با گزینهٔ `--help`
|
||||||
|
بسیاری از فرمانها با گزینهٔ `--help` یا `-h` خلاصهای از کاربردها و گزینهها را چاپ میکنند. این خروجی برای مرور سریع مناسب است و معمولاً در ترمینال جاری ظاهر میشود.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ cp --help
|
||||||
|
```
|
||||||
|
|
||||||
|
این روش زمانی مفید است که فقط به دنبال گزینهٔ خاصی هستید و نمیخواهید صفحهٔ بلند `man` را کامل مطالعه کنید.
|
||||||
|
|
||||||
|
## مستندات GNU با `info`
|
||||||
|
برخی ابزارها راهنمای تکمیلی خود را در قالب `info` ارائه میدهند. این محیط مشابه یک درخت موضوعی عمل میکند و با کلیدهای جهت یا دستوراتی مثل `n` (بعدی)، `p` (قبلی) و `u` (بازگشت به سطح بالاتر) کار میکند.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ info coreutils 'cp invocation'
|
||||||
|
```
|
||||||
|
|
||||||
|
اگر تازه با `info` آشنا میشوید، با اجرای `info info` راهنمای استفاده از این سیستم را مطالعه کنید.
|
||||||
|
|
||||||
|
## یافتن دستوراتی که نام دقیقشان را نمیدانید
|
||||||
|
- `apropos KEYWORD`: فهرست صفحات راهنمایی که کلمهٔ مورد نظر در توضیح آنها آمده است.
|
||||||
|
```bash
|
||||||
|
$ apropos archive
|
||||||
|
```
|
||||||
|
- `man -k KEYWORD`: مخفف همان `apropos` است و نتیجهٔ مشابهی میدهد.
|
||||||
|
- جستوجو در اینترنت و خواندن مثالهای عملی از وبسایتهایی مانند TLDR Pages یا ExplainShell میتواند زمان یادگیری را کاهش دهد؛ فقط مطمئن شوید که دستورات به سیستم شما آسیب نمیزنند.
|
||||||
|
|
||||||
|
## عادتهای یادگیری مؤثر
|
||||||
|
- هنگام مطالعهٔ هر دستور، چند مثال عملی بنویسید و فوراً اجرا کنید.
|
||||||
|
- یادداشتهای شخصی از گزینههای مهم یا خطاهای متداول تهیه کنید تا در پروژههای بعدی سریعتر به نتیجه برسید.
|
||||||
|
- در جلسات ترمینالی تمرینی، با استفاده از کلید `↑` (تاریخچه) فرمانهای قبلی را بازبینی کنید تا الگوهای تکراری را به خاطر بسپارید.
|
||||||
@@ -0,0 +1,71 @@
|
|||||||
|
# درسنامه ۹: مدیریت تاریخ و تقویم با `date` و `cal`
|
||||||
|
|
||||||
|
## نمایش تاریخ و زمان فعلی با `date`
|
||||||
|
دستور `date` اطلاعات زمانی سیستم را چاپ میکند. اجرای سادهٔ آن خروجی پیشفرض را نشان میدهد که شامل روز هفته، ماه، روز، زمان، منطقهٔ زمانی و سال است.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ date
|
||||||
|
Thu Jun 20 10:42:03 +0330 2024
|
||||||
|
```
|
||||||
|
|
||||||
|
## قالببندی سفارشی
|
||||||
|
با استفاده از `+` و رشتههای قالببندی میتوانید خروجی را متناسب با نیاز خود تنظیم کنید. هر کاراکتر پس از `%` جایگزین بخش خاصی از زمان میشود.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ date "+%Y-%m-%d %H:%M"
|
||||||
|
2024-06-20 10:42
|
||||||
|
$ date "+Week %V of %Y"
|
||||||
|
Week 25 of 2024
|
||||||
|
```
|
||||||
|
|
||||||
|
نمونهای از پرکاربردترین نگاشتها:
|
||||||
|
- `%Y`: سال چهار رقمی
|
||||||
|
- `%m`: ماه عددی (۰۱ تا ۱۲)
|
||||||
|
- `%d`: روز ماه
|
||||||
|
- `%H:%M:%S`: ساعت به فرمت ۲۴ساعته
|
||||||
|
|
||||||
|
## کار با زمانهای دیگر
|
||||||
|
گزینهٔ `-d` امکان تبدیل و نمایش زمان دلخواه را فراهم میکند. مثال زیر میگوید «فردا همین ساعت»:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ date -d "tomorrow"
|
||||||
|
Fri Jun 21 10:42:03 +0330 2024
|
||||||
|
```
|
||||||
|
|
||||||
|
همچنین میتوانید رشتههای مشخص مانند `2024-12-01 09:30` را به فرمت انسانی تبدیل کنید یا اختلاف زمانی بسنجید.
|
||||||
|
|
||||||
|
## مشاهدهٔ تقویم با `cal`
|
||||||
|
دستور `cal` (Calendar) تقویم دلخواه را چاپ میکند. بدون آرگومان، ماه جاری نمایش داده میشود.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ cal
|
||||||
|
June 2024
|
||||||
|
Su Mo Tu We Th Fr Sa
|
||||||
|
1
|
||||||
|
2 3 4 5 6 7 8
|
||||||
|
9 10 11 12 13 14 15
|
||||||
|
16 17 18 19 20 21 22
|
||||||
|
23 24 25 26 27 28 29
|
||||||
|
30
|
||||||
|
```
|
||||||
|
|
||||||
|
## گزینههای پرکاربرد `cal`
|
||||||
|
- `cal -y 2025`: تقویم کامل سال ۲۰۲۵ را چاپ میکند.
|
||||||
|
- `cal 3 2024`: تقویم ماه مارس سال ۲۰۲۴ را نمایش میدهد.
|
||||||
|
- `ncal`: نسخهٔ جایگزین `cal` است که چینش متفاوتی دارد و اطلاعات بیشتری مثل شمارهٔ هفته را نشان میدهد.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
$ ncal -w
|
||||||
|
June 2024
|
||||||
|
Mo Tu We Th Fr Sa Su Ne
|
||||||
|
1 2 22
|
||||||
|
3 4 5 6 7 8 9 23
|
||||||
|
10 11 12 13 14 15 16 24
|
||||||
|
17 18 19 20 21 22 23 25
|
||||||
|
24 25 26 27 28 29 30 26
|
||||||
|
```
|
||||||
|
|
||||||
|
## کاربردهای عملی
|
||||||
|
- اسکریپتهای پشتیبانگیری برای برچسبگذاری فایلها با تاریخ ساخت از `date +"%Y%m%d"` استفاده میکنند.
|
||||||
|
- در برنامهریزی تیمی، گزارش گرفتن از موعدها یا تعطیلات با `cal -y` سریعتر از جستوجو در تقویمهای گرافیکی است.
|
||||||
|
- برای یادآوری رویدادها، میتوان خروجی `cal` را با ابزارهایی مثل `grep` ترکیب کرد و روزهای خاص را برجسته نمود.
|
||||||
@@ -0,0 +1,40 @@
|
|||||||
|
# شروع کار با دوره
|
||||||
|
|
||||||
|
## منابع پیشنهادی
|
||||||
|
برای آشنایی اولیه با مفاهیم لینوکس، این دو فایل را مطالعه کنید:
|
||||||
|
|
||||||
|
- [لینوکس چیست؟](assets/لینوکس چیست؟.pdf)
|
||||||
|
- [توزیعهای مختلف لینوکس](assets/توزیع_های مختلف لینوکس.pdf)
|
||||||
|
|
||||||
|
دانلود و مطالعه این منابع به شما کمک میکند قبل از ورود به درسنامهها دید بهتری نسبت به سیستمعامل لینوکس داشته باشید.
|
||||||
|
|
||||||
|
## آشنایی سریع با SSH
|
||||||
|
`SSH` یا Secure Shell پروتکلی است که امکان اتصال امن به سیستمهای دیگر را از طریق خط فرمان فراهم میکند. برای برقراری اتصال کافی است نام کاربری و آدرس سروری که میخواهید به آن وصل شوید را بدانید.
|
||||||
|
|
||||||
|
الگوی کلی دستور:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
ssh -p 22 USERNAME@HOST
|
||||||
|
```
|
||||||
|
|
||||||
|
- `USERNAME`: نام کاربری روی سرور مقصد
|
||||||
|
- `HOST`: نام دامنه یا آدرس IP سرور
|
||||||
|
- `-p` : شماره پورت ssh
|
||||||
|
|
||||||
|
### گامهای اتصال
|
||||||
|
1. در ترمینال دستور بالا را با مقادیر واقعی اجرا کنید؛ برای مثال:
|
||||||
|
```bash
|
||||||
|
ssh -p 1117 9823061117@185.208.181.24
|
||||||
|
```
|
||||||
|
2. در اولین اتصال ممکن است پیامی برای تأیید کلید امنیتی دریافت کنید. تایید (`yes`) کنید تا کلید ذخیره شود.
|
||||||
|
3. رمز عبور کاربر مقصد را وارد کنید. به دلایل امنیتی حین تایپ چیزی نمایش داده نمیشود.
|
||||||
|
4. پس از احراز هویت موفق، ترمینال شما به محیط سرور متصل میشود و میتوانید دستورات را روی آن اجرا کنید.
|
||||||
|
|
||||||
|
در طول دوره بیشتر درباره کار با SSH و مدیریت سرورها صحبت خواهیم کرد؛ فعلا همین گامهای ساده برای شروع کافی است.
|
||||||
|
|
||||||
|
## نکته مهم
|
||||||
|
تمام دانشجویان برای ورود به سرور باید مشخصات زیر را جایگزین کنند:
|
||||||
|
|
||||||
|
- نام کاربری: شماره دانشجویی
|
||||||
|
- رمز عبور: شماره دانشجویی
|
||||||
|
- پورت: ۴ رقم آخر شماره دانشجویی
|
||||||
@@ -0,0 +1,4 @@
|
|||||||
|
# توضیح درس
|
||||||
|
|
||||||
|
این صفحه برای توضیح درس «زبانهای برنامهنویسی» ایجاد شده است.
|
||||||
|
|
||||||
@@ -0,0 +1,234 @@
|
|||||||
|
@font-face {
|
||||||
|
font-family: IRANSansXREG;
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 100;
|
||||||
|
src: url('../fonts/IRANSansX-Regular.woff') format('woff'),
|
||||||
|
url('../fonts/IRANSansX-Regular.woff2') format('woff2');
|
||||||
|
}
|
||||||
|
|
||||||
|
@font-face {
|
||||||
|
font-family: IRANSansXBOLD;
|
||||||
|
font-style: normal;
|
||||||
|
font-weight: 200;
|
||||||
|
src: url('../fonts/IRANSansX-Bold.woff') format('woff'),
|
||||||
|
url('../fonts/IRANSansX-Bold.woff2') format('woff2');
|
||||||
|
}
|
||||||
|
|
||||||
|
body{
|
||||||
|
font-family: IRANSansXREG;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1, h2, h3, h4, h5, h6,input, textarea {
|
||||||
|
font-family: IRANSansXBOLD !important;
|
||||||
|
}
|
||||||
|
h1 {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
.wrapper {
|
||||||
|
max-width: 900px;
|
||||||
|
margin: 0 auto;
|
||||||
|
}
|
||||||
|
.ltr {
|
||||||
|
direction: ltr;
|
||||||
|
}
|
||||||
|
.text-right {
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
.text-center {
|
||||||
|
text-align: center;
|
||||||
|
}
|
||||||
|
.text-left {
|
||||||
|
text-align: left;
|
||||||
|
}
|
||||||
|
.text-small {
|
||||||
|
font-size: 0.8em;
|
||||||
|
}
|
||||||
|
.text-xsmall {
|
||||||
|
font-size: 0.6em;
|
||||||
|
}
|
||||||
|
.text-large {
|
||||||
|
font-size: 1.2em;
|
||||||
|
}
|
||||||
|
.text-xlarge {
|
||||||
|
font-size: 1.4em;
|
||||||
|
}
|
||||||
|
.text-underline {
|
||||||
|
text-decoration:underline;
|
||||||
|
}
|
||||||
|
|
||||||
|
.text-thin {
|
||||||
|
font-weight: 400;
|
||||||
|
}
|
||||||
|
.text-UltraLight {
|
||||||
|
font-weight: 400;
|
||||||
|
}
|
||||||
|
.text-light {
|
||||||
|
font-weight: 400;
|
||||||
|
}
|
||||||
|
.text-regular {
|
||||||
|
font-weight: normal;
|
||||||
|
}
|
||||||
|
.text-medium {
|
||||||
|
font-weight: 700;
|
||||||
|
}
|
||||||
|
.text-demibold {
|
||||||
|
font-weight: 700;
|
||||||
|
}
|
||||||
|
.text-bold {
|
||||||
|
font-weight: bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
.text-extrabold {
|
||||||
|
font-weight: 700;
|
||||||
|
}
|
||||||
|
.text-black {
|
||||||
|
font-weight: 700;
|
||||||
|
}
|
||||||
|
.text-extrablack {
|
||||||
|
font-weight: 700;
|
||||||
|
}
|
||||||
|
.text-heavy {
|
||||||
|
font-weight: 700;
|
||||||
|
}
|
||||||
|
|
||||||
|
::-webkit-input-placeholder {
|
||||||
|
font-family: IRANSansX;
|
||||||
|
}
|
||||||
|
::-moz-placeholder {
|
||||||
|
font-family: IRANSansX;
|
||||||
|
}
|
||||||
|
:-ms-input-placeholder {
|
||||||
|
font-family: IRANSansX;
|
||||||
|
}
|
||||||
|
::placeholder {
|
||||||
|
font-family: IRANSansX;
|
||||||
|
}
|
||||||
|
|
||||||
|
.md-header {
|
||||||
|
background-color: #1e1e1e !important; /* رنگ پسزمینه هدر */
|
||||||
|
color: #ffffff !important; /* رنگ متن */
|
||||||
|
box-shadow: none; /* حذف سایه اضافی */
|
||||||
|
}
|
||||||
|
|
||||||
|
/* رنگ لینکهای هدر */
|
||||||
|
.md-header__title,
|
||||||
|
.md-header__topic,
|
||||||
|
.md-header a {
|
||||||
|
color: #ffffff !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* رنگ آیکونها مثل جستجو */
|
||||||
|
.md-search__icon,
|
||||||
|
.md-icon {
|
||||||
|
color: #ffffff !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.md-typeset p {
|
||||||
|
text-align: justify;
|
||||||
|
}
|
||||||
|
|
||||||
|
.md-typeset table {
|
||||||
|
width: 100% !important;
|
||||||
|
display: table;
|
||||||
|
table-layout: auto;
|
||||||
|
}
|
||||||
|
.nodes {
|
||||||
|
margin-left: auto;
|
||||||
|
margin-right: auto;
|
||||||
|
width: fit-content; /* یا یک عرض مشخص مثلا width: 200px */
|
||||||
|
font-family: IRANSansXREG !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.actor{
|
||||||
|
font-family: IRANSansXREG !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* استایلهای Mermaid برای فونت ایران سنس */
|
||||||
|
.mermaid {
|
||||||
|
font-family: IRANSansXREG !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* گرهها و شکلهای مختلف */
|
||||||
|
.mermaid .node text,
|
||||||
|
.mermaid .nodeLabel,
|
||||||
|
.mermaid .cluster-label text,
|
||||||
|
.mermaid .label,
|
||||||
|
.mermaid .labelText {
|
||||||
|
font-family: IRANSansXREG !important;
|
||||||
|
font-size: 14px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* عناوین و برچسبهای گرهها */
|
||||||
|
.mermaid .node rect,
|
||||||
|
.mermaid .node circle,
|
||||||
|
.mermaid .node ellipse,
|
||||||
|
.mermaid .node polygon {
|
||||||
|
font-family: IRANSansXREG !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* متن روی فلشها و اتصالات */
|
||||||
|
.mermaid .edgeLabel,
|
||||||
|
.mermaid .edgeLabel text,
|
||||||
|
.mermaid .edgeLabel span {
|
||||||
|
font-family: IRANSansXREG !important;
|
||||||
|
font-size: 12px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* نمودارهای توالی */
|
||||||
|
.mermaid .actor,
|
||||||
|
.mermaid .actor-box,
|
||||||
|
.mermaid .actor-line {
|
||||||
|
font-family: IRANSansXREG !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.mermaid .messageText,
|
||||||
|
.mermaid .noteText,
|
||||||
|
.mermaid .loopText {
|
||||||
|
font-family: IRANSansXREG !important;
|
||||||
|
font-size: 13px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* نمودارهای فلوچارت */
|
||||||
|
.mermaid .flowchart-label,
|
||||||
|
.mermaid .flowchartTitleText {
|
||||||
|
font-family: IRANSansXREG !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* عناوین اصلی نمودارها */
|
||||||
|
.mermaid .titleText {
|
||||||
|
font-family: IRANSansXBOLD !important;
|
||||||
|
font-weight: bold !important;
|
||||||
|
font-size: 16px !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* تنظیمات کلی برای همه المانهای متنی Mermaid */
|
||||||
|
.mermaid text {
|
||||||
|
font-family: IRANSansXREG !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* تنظیمات ویژه برای متنهای فارسی */
|
||||||
|
.mermaid [dir="rtl"] text,
|
||||||
|
.mermaid text[dir="rtl"] {
|
||||||
|
direction: rtl !important;
|
||||||
|
text-anchor: end !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* تنظیمات اضافی برای بهتر نمایش دادن فونت فارسی */
|
||||||
|
.mermaid svg {
|
||||||
|
font-family: IRANSansXREG !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* استایل برای نودهای مختلف */
|
||||||
|
.mermaid .nodes text {
|
||||||
|
font-family: IRANSansXREG !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
.md-search__options{
|
||||||
|
|
||||||
|
font-family: IRANSansXREG !important;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
+2050
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
Binary file not shown.
|
After Width: | Height: | Size: 1.8 KiB |
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
@@ -0,0 +1,18 @@
|
|||||||
|
/*!
|
||||||
|
* Lunr languages, `Danish` language
|
||||||
|
* https://github.com/MihaiValentin/lunr-languages
|
||||||
|
*
|
||||||
|
* Copyright 2014, Mihai Valentin
|
||||||
|
* http://www.mozilla.org/MPL/
|
||||||
|
*/
|
||||||
|
/*!
|
||||||
|
* based on
|
||||||
|
* Snowball JavaScript Library v0.3
|
||||||
|
* http://code.google.com/p/urim/
|
||||||
|
* http://snowball.tartarus.org/
|
||||||
|
*
|
||||||
|
* Copyright 2010, Oleg Mazko
|
||||||
|
* http://www.mozilla.org/MPL/
|
||||||
|
*/
|
||||||
|
|
||||||
|
!function(e,r){"function"==typeof define&&define.amd?define(r):"object"==typeof exports?module.exports=r():r()(e.lunr)}(this,function(){return function(e){if(void 0===e)throw new Error("Lunr is not present. Please include / require Lunr before this script.");if(void 0===e.stemmerSupport)throw new Error("Lunr stemmer support is not present. Please include / require Lunr stemmer support before this script.");e.da=function(){this.pipeline.reset(),this.pipeline.add(e.da.trimmer,e.da.stopWordFilter,e.da.stemmer),this.searchPipeline&&(this.searchPipeline.reset(),this.searchPipeline.add(e.da.stemmer))},e.da.wordCharacters="A-Za-zªºÀ-ÖØ-öø-ʸˠ-ˤᴀ-ᴥᴬ-ᵜᵢ-ᵥᵫ-ᵷᵹ-ᶾḀ-ỿⁱⁿₐ-ₜKÅℲⅎⅠ-ↈⱠ-ⱿꜢ-ꞇꞋ-ꞭꞰ-ꞷꟷ-ꟿꬰ-ꭚꭜ-ꭤff-stA-Za-z",e.da.trimmer=e.trimmerSupport.generateTrimmer(e.da.wordCharacters),e.Pipeline.registerFunction(e.da.trimmer,"trimmer-da"),e.da.stemmer=function(){var r=e.stemmerSupport.Among,i=e.stemmerSupport.SnowballProgram,n=new function(){function e(){var e,r=f.cursor+3;if(d=f.limit,0<=r&&r<=f.limit){for(a=r;;){if(e=f.cursor,f.in_grouping(w,97,248)){f.cursor=e;break}if(f.cursor=e,e>=f.limit)return;f.cursor++}for(;!f.out_grouping(w,97,248);){if(f.cursor>=f.limit)return;f.cursor++}d=f.cursor,d<a&&(d=a)}}function n(){var e,r;if(f.cursor>=d&&(r=f.limit_backward,f.limit_backward=d,f.ket=f.cursor,e=f.find_among_b(c,32),f.limit_backward=r,e))switch(f.bra=f.cursor,e){case 1:f.slice_del();break;case 2:f.in_grouping_b(p,97,229)&&f.slice_del()}}function t(){var e,r=f.limit-f.cursor;f.cursor>=d&&(e=f.limit_backward,f.limit_backward=d,f.ket=f.cursor,f.find_among_b(l,4)?(f.bra=f.cursor,f.limit_backward=e,f.cursor=f.limit-r,f.cursor>f.limit_backward&&(f.cursor--,f.bra=f.cursor,f.slice_del())):f.limit_backward=e)}function s(){var e,r,i,n=f.limit-f.cursor;if(f.ket=f.cursor,f.eq_s_b(2,"st")&&(f.bra=f.cursor,f.eq_s_b(2,"ig")&&f.slice_del()),f.cursor=f.limit-n,f.cursor>=d&&(r=f.limit_backward,f.limit_backward=d,f.ket=f.cursor,e=f.find_among_b(m,5),f.limit_backward=r,e))switch(f.bra=f.cursor,e){case 1:f.slice_del(),i=f.limit-f.cursor,t(),f.cursor=f.limit-i;break;case 2:f.slice_from("løs")}}function o(){var e;f.cursor>=d&&(e=f.limit_backward,f.limit_backward=d,f.ket=f.cursor,f.out_grouping_b(w,97,248)?(f.bra=f.cursor,u=f.slice_to(u),f.limit_backward=e,f.eq_v_b(u)&&f.slice_del()):f.limit_backward=e)}var a,d,u,c=[new r("hed",-1,1),new r("ethed",0,1),new r("ered",-1,1),new r("e",-1,1),new r("erede",3,1),new r("ende",3,1),new r("erende",5,1),new r("ene",3,1),new r("erne",3,1),new r("ere",3,1),new r("en",-1,1),new r("heden",10,1),new r("eren",10,1),new r("er",-1,1),new r("heder",13,1),new r("erer",13,1),new r("s",-1,2),new r("heds",16,1),new r("es",16,1),new r("endes",18,1),new r("erendes",19,1),new r("enes",18,1),new r("ernes",18,1),new r("eres",18,1),new r("ens",16,1),new r("hedens",24,1),new r("erens",24,1),new r("ers",16,1),new r("ets",16,1),new r("erets",28,1),new r("et",-1,1),new r("eret",30,1)],l=[new r("gd",-1,-1),new r("dt",-1,-1),new r("gt",-1,-1),new r("kt",-1,-1)],m=[new r("ig",-1,1),new r("lig",0,1),new r("elig",1,1),new r("els",-1,1),new r("løst",-1,2)],w=[17,65,16,1,0,0,0,0,0,0,0,0,0,0,0,0,48,0,128],p=[239,254,42,3,0,0,0,0,0,0,0,0,0,0,0,0,16],f=new i;this.setCurrent=function(e){f.setCurrent(e)},this.getCurrent=function(){return f.getCurrent()},this.stem=function(){var r=f.cursor;return e(),f.limit_backward=r,f.cursor=f.limit,n(),f.cursor=f.limit,t(),f.cursor=f.limit,s(),f.cursor=f.limit,o(),!0}};return function(e){return"function"==typeof e.update?e.update(function(e){return n.setCurrent(e),n.stem(),n.getCurrent()}):(n.setCurrent(e),n.stem(),n.getCurrent())}}(),e.Pipeline.registerFunction(e.da.stemmer,"stemmer-da"),e.da.stopWordFilter=e.generateStopWordFilter("ad af alle alt anden at blev blive bliver da de dem den denne der deres det dette dig din disse dog du efter eller en end er et for fra ham han hans har havde have hende hendes her hos hun hvad hvis hvor i ikke ind jeg jer jo kunne man mange med meget men mig min mine mit mod ned noget nogle nu når og også om op os over på selv sig sin sine sit skal skulle som sådan thi til ud under var vi vil ville vor være været".split(" ")),e.Pipeline.registerFunction(e.da.stopWordFilter,"stopWordFilter-da")}});
|
||||||
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
File diff suppressed because one or more lines are too long
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user