20 نمونه اسکریپت نویسی با Bash
هدف این راهنما ایجاد درک درستی از اسکریپت bash، مفاهیم برنامه نویسی bash و سینتکس آنها، همراه با چند مثال ارزشمند است. در این مطلب، اسکریپت نویسی bash را از پایه و نحوه خودکارسازی فرآیندها در سرورهای لینوکس را یاد خواهید گرفت. متغیرها، دستورات شرطی، انتقال آرگومانهای خط فرمان به اسکریپتها، خواندن ورودی کاربر، حلقهها، توابع و بسیاری موارد دیگر بحث خواهیم کرد.
اسکریپت shell/bash چیست؟
برنامه نویسی Bash ابزار قدرتمندی برای خودکارسازی وظایف در یک سیستم لینوکس فراهم میکند. از کاربرد دستورات خروج از shell گرفته تا کنترل جریان یک اسکریپت با عبارات if-elseif-else، اسکریپتهای bash به شما این امکان را میدهند که از قدرت خط فرمان برای انجام عملیات پیچیده استفاده کنید.
با استفاده از مجوزهای فایل(file permissions)، میتوانید مطمئن شد که فقط یک کاربر معتبر میتواند به اطلاعات حساس دسترسی داشته باشد. با دستور bash read حتی میتوان ورودیهای کاربر را در میان یک اسکریپت جمع آوری نمود.
علاوه بر این، توانایی ذخیره مقادیر به عنوان متغیرهای رشته و دستکاری مقادیر رشته به اسکریپت bash سطحی از تطبیق پذیری قابل مقایسه با سایر زبانهای برنامه نویسی میدهد.
به دنبال خودکار کردن کارهای ساده یا نوشتن اسکریپتهای پیچیده باشید، اسکریپت bash یک مهارت ضروری برای هر مدیر سرور لینوکس است.
فایلی که حاوی مجموعهای از دستورات اجرایی باشد، اسکریپت bash نامیده میشود که این فایلها پسوند .sh دارند.
پیاده سازیهای مختلف shell چیست؟
- bsh به Bourne shell معروف است که به نام استفان بورن نامگذاری شده است.
- Bash (Bourne Again Shell) یک نسخه بهبود یافته از bash است. این برنامه shell پیش فرض برای اکثر سیستمهای شبهیونیکس است.
- سایر برنامههای shell مانند C shell، Korn shell و غیره.
Bash یک برنامه shell، یک مفسر خط فرمان bash و یک زبان برنامه نویسی با امکانات کامل برای نوشتن اسکریپتهای شِل است. در ادامه نحوه نوشتن اسکریپتهای shell با استفاده از سینتکس bash را یاد خواهیم گرفت. این راهنما شامل 20 نمونه اسکریپت bash است.
چگونه یک اسکریپت shell ایجاد کنیم؟
ابتدا باید یک shell script در ترمینال خود ایجاد کنید. می توانید از دستور touch script.sh استفاده کنید. شما می توانید از هر نامی با پسوند .sh برای فایل استفاده کنید زیرا تمام فایل های اسکریپت شِل با پسوند .sh خاتمه می یابند.
- نکاتی برای نوشتن اسکریپت
در ابتدای هر اسکریپت (هنگام نوشتن اسکریپت) باید مشخص کنیم که با چه نوع شِلی اجرا شود. خط اول اسکریپت به shebang line معروف است. در ادامه shebang line برای شِلهای Bourne، Bourne Again Shell و C shell آمده است.
- SH - #!/bin/sh
- BASH - #!/bin/bash
- ZSH - #!/bin/zsh
نام shebang از نمادهای # و ! گرفته شده است که به ترتیب با نام sharp و bang شناخته میشوند. sharp + bang بعدا به shebang تبدیل شد.
- فایل اسکریپت را باز کرده و ویرایش کنید
می توانید از هر ویرایشگر متنی برای باز کردن و ویرایش فایل اسکریپتی که ایجاد کردهاید استفاده کنید. برای مثال، میتوانید از vim script.sh یا nano script.sh برای باز کردن فایل با ویرایشگر vim یا ویرایشگر nano استفاده کنید.
ابتدا باید خط shebang را بنویسیم که به سیستم عامل میگوید از کدام برنامه فرمان شل برای اجرای خطوط فرمان زیر استفاده کند. سپس میتوانیم اولین خط اسکریپت خود را برای خروجی پیامی مانند این بنویسیم:
echo "Hello world!"
برای شروع به نوشتن در ویرایشگر vim باید s را فشار داده تا به حالت INSERT بروید. پس از تکمیل فایل اسکریپت، باید کلید esc را فشار دهید و : و w و q را برای نوشتن تغییرات و خروج از ویرایشگر vim تایپ کنید.
- مجوزها را به فایل اسکریپت خود اضافه کنید
باید به دنبال اجرای مجوز روی آن فایل باشید، به احتمال زیاد، ممکن است حتی به عنوان مالک فایل، مجوز اجرای فایل script.sh را نداشته باشید. می توانید مجوزها را با استفاده از دستور ls –l script.sh بررسی کنید. اگر مجوز اجرا ندارید، میتوانید با اجرای دستور chmod u+x script.sh آن را دریافت کنید.
اگر دوباره دستور ls –l script.sh را اجرا کنید، ممکن است متوجه شوید که مجوزهای اجرایی اضافه شدهاند و رنگ نام فایل از وقتی فایل اجرایی شده تغییر کرده است.
- اجرای اسکریپت
در نهایت میتوانید با دستور bash script.sh یا script.sh/. فایل اسکریپت را اجرا کنید.
20 مثال برای بش اسکریپتینگ (Bash Scripting)
از آنجایی که اصول اولیه را میدانید، بیایید از نمونههای اسکریپت bash استفاده کنیم و بیشتر بیاموزیم.
-
مثال 01 – استفاده از متغیرها در اسکریپت
اولین مثال نحوه استفاده از متغیرها در اسکریپت است. اسکریپتهای Bash به ما این امکان را میدهند که از متغیرها به روشهای مختلف استفاده کنیم. به عنوان مثال، بیایید اسکریپت خود را با استفاده از دو متغیر name و place بنویسیم.
سپس می توانیم یک شخص و نام مکان را به دو متغیر اختصاص دهیم و آنها را در یک دستور echo خروجی دهیم. می توانید یک اسکریپت مشابه به شرح زیر بنویسید و اسکریپت را در خط فرمان bash ذخیره و اجرا کنید.
#!/bin/bash
echo "use of variables in scripts"
echo "==========================="
name="Hasan"
place="Rasht"
echo "$name lives in $place"
-
مثال 02 – ورودیها و خروجیها
می دانیم که می توان جریانهای رشته را به ترمینال خروجی داد. علاوه بر این، می توان ورودی را هم از ترمینال دریافت کرد.
در این مثال، قصد داریم این کار را با درخواست نام از طریق ترمینال انجام دهیم. کد زیر کار مورد نیاز را انجام میدهد. میتوانیم از دستور echo برای خروجی رشتهها و اضافه کردن خطوط خالی به کد استفاده کنیم.
علاوه بر این، ما می توانیم از کلمه کلیدی read برای گرفتن ورودی از کاربر در bash و یک متغیر برای ذخیره نام داده شده از طریق ترمینال استفاده کنیم.
#!/bin/bash
echo "Inputs and outputs"
echo "Hi, Im Hasan, What is your name ?"
read name
echo "Nice to meet you $name!"
echo "* end of script *"
-
مثال 03 - عبارات شرطی با IF
در این مثال از یک دستور if ساده برای بررسی موجود بودن فایل استفاده میکنیم. به راحتی میتوان سینتکس یک دستور if statement را مانند یک زبان برنامهنویسی معمولی درک کرد.
تنها تفاوت این است که باید از کلمه کلیدی fi برای نشان دادن پایان شرطها استفاده کنیم.
#!/bin/bash
echo if then else statements
echo
file=parsdev.txt
if [ -e $file ]
then
echo "Yes, File exists!"
else
echo "file does not exist"
echo "creating the file..".
touch $file
fi
echo "* end of script *"
-
مثال 04 - ساختار Case
در این مثال bash، در حال خروجی برخی از optionهای کاربر و ارائه شناسهها هستیم و برای هر گزینه از یک دستور استفاده میکنیم.
هنگامی که کاربر یک option را انتخاب کرد، دستور مربوطه را اجرا میکند. در این مثال از دستورات uptime و date برای گزینهها استفاده کردیم.
برای نشان دادن پایان case باید از کلمه کلیدی esac استفاده شود.
#!/bin/bash
echo "choose an option:"
echo "1 - system uptime"
echo "2 - date and time"
echo
read choice
case $choice in
1) uptime;;
2) date;;
*) invalid argument
esac
echo
echo "* end of script *"
-
مثال 05 - حلقه for
در این مثال، از یک حلقه for برای خروجی یک رشته معین به تعداد مشخص استفاده میکنیم.
#!/bin/bash
echo "For loop example"
for i in 1 2 3 4 5
do
echo "$i - Welcome to ParsDev.com"
done
echo "* end of script *"
-
مثال 06 - استفاده از Do while
استفاده از حلقه do while در برنامه نویسی bash ساده است. در این مثال، کلمه کلیدی-le نشان دهنده علامت کوچکتر یا مساوی در یک زبان برنامه نویسی معمولی است.اسکریپت زیر تا زمانی اجرا میشود که مقدار متغیر از 5 بیشتر شود.
#!/bin/bash
echo "Do while loop example"
a=1
while [ $a -le 5 ]
do
echo "Number is $a"
(( a++ ))
done
echo "* End of Script *"
مثال 07 - دسترسی به دادهها از یک فایل
معمولا برای خواندن فایلها در لینوکس از دستور cat استفاده میکنیم، باید بدانیم که میشود از این دستور در داخل یک فایل اسکریپت هم استفاده کرد. ابتدا یک فایل با نام parsdev.txt ایجاد میکنیم که باید خالی باشد و سعی میکنیم یک فایل خالی، parsdev.txt را با دستور cat parsdev.txt بخوانیم.
حالا history دستورات اجرا شده را دریافت کرده و خروجی را به فایل txt منتقل میکنیم. در پایان، میتوان از دستور cat در داخل اسکریپت استفاده کرده و آن را آزمایش نمود.
#!/bin/bash
cat abc.txt
-
مثال 08 - بررسی اتصال سرور ریموت
در این مثال، یک مقصد(destination) را با استفاده از یک آدرس IP یا نام دامنه پینگ میکنیم. در اسکریپت، ابتدا از کاربر می خواهیم یک آدرس IP وارد کند.
سپس ورودی را خوانده و با دستور ping از آن استفاده کرده و خروجی دستور ping را دریافت و نمایش میدهیم؛ بعد یک پیام بر اساس وضعیت پینگ ارسال میکنیم که نشان میدهد موفقیت آمیز است یا خیر.
ping –c2 $ip دستور میدهد که فقط مقصد مورد نظر را دو بار پینگ کنید.
همان طور که میدانید، حالتهای خروج 0 نشان دهنده موفقیت در دستور پینگ است. اگر 0 باشد، پیام success و در غیر این صورت، پیام try again را نمایش میدهیم.
#!/bin/bash
echo "Enter an ip address to ping test :"
read ip
echo "you gave - $ip"
echo "pinging > +++++++++++++++++++++++++++++++"
ping -c2 $ip
if [ $? -eq 0 ]
then
echo
echo "=============================================="
echo "Ping success!"
else
echo "----------------------------------------------"
echo "Ping not success!, try again.."
fi
echo
echo "* end of script *"
-
مثال 09 - حذف فایلهای قدیمی
می توان یک اسکریپت برای حذف فایلهای قدیمی نوشت، این کار را با تعیین قدمت یک اسکریپت و حذف آن از یک مکان خاص انجام دهیم.
فرض کنید میخواهیم فایل های قدیمیتر از 90 روز را حذف کنیم. اگر برای تست فایلهای قدیمیتری ندارید، میتوان آنها را با دستور زیر ایجاد کرد:
touch -d "Tue, 21 March 2023 00:54:28" file1
این فایل file1 نام دارد و در 2 سپتامبر 2022 ایجاد شده است. سپس میتوانیم از دستور زیر برای حذف آن فایلها استفاده کنیم:
find /home/parsdev/scripts -mtime +90 -exec rm {} \;
علاوه بر این، میتوانید از دستور زیر برای پیدا کردن و لیست کردن آنها هم استفاده نمود:
find /home/parsdev/scripts -mtime +90 -exec ls -l {} \;
#!/bin/bash
find /home/parsdev/scripts/ -mtime +90 -exec rm {} \;
-
مثال 10 - بکاپ فایل سیستم
در اسکریپت زیر، با استفاده از دستور tar یک نسخه بکاپ از دایرکتوری backup ایجاد کرده و از gzip برای فشردهسازی آن از scripts-backup.tar به scripts-backup.tar.gz استفاده مینمائیم. در پایان هم یک پیام به صورت process finished را خروجی میدهد.
#!/bin/bash
tar cvf /home/parsdev/scripts/scripts-backup.tar /home/parsdev/scripts/backup
gzip scripts-backup.tar
echo "process finished!"
خرید سرور مجازی لینوکس در پنج موقعیت جغرافیایی ایران، ترکیه، هلند، آلمان و آمریکا با قابلیت تحویل آنی در پارسدو فراهم است.
-
مثال 11 - Sleep
در این مثال از دستور sleep برای قرار دادن سیستم در حالت Sleep استفاده کردیم، میتوانیم زمان sleep را تعیین و نحوه عملکرد آن را بررسی کنیم.
دستور sleep فرآیند را متوقف کرده و سیستم را به حالت خواب میبرد. در اینجا، از دستور sleep با یک حلقه for استفاده میکنیم که هر 20 ثانیه یک پیام شب بخیر به شما میدهد!
#!/bin/bash
echo "For loop with sleep timer"
for i in 1 2 3 4 5
do
echo "Im going to sleep - day $i" && sleep 20
done
echo "* end of script *"
-
مثال 12 - آرایه
آرایه bash یک ساختار داده (data structure) برای ذخیره اطلاعات مانند یک شاخص(index) است که هنگام ذخیره دادهها و خواندن آنها به روشهای مختلف مفید خواهد بود.
این آرایهها برای ذخیره عناصر مختلف مانند رشتهها و اعداد خوب هستند. در این مثال از آرایهای استفاده میکنیم که شامل مشتریان است و آنها را یک به یک با استفاده از حلقه for میخوانیم.
#!/bin/bash
customers=(Ali Hasan Ramin Maryam Somayeh Mojtaba Nader Fariba)
echo "Read data from an array"
for i in "${customers[@]}"
do
echo "Customer name : $i"
done
echo "* end of script *"
-
مثال 13 - توابع Bash
می توان توابع را در اسکریپتهای bash هم مانند یک زبان برنامه نویسی معمولی نوشت تا هر زمان که بخواهیم از آنها در داخل فایلهای اسکریپت استفاده کنیم.
در این مثال، از مجموعهای از مهمانان استفاده نموده و از هر یک با پیام تبریک استقبال میکنیم. زمانی که از آن در داخل یک اسکریپت استفاده شود، میتوان این تابع bash را با نام فراخوانی کنیم.
#!/bin/bash
welcome () {
guests=(Ali Hasan Ramin Maryam Somayeh Mojtaba Nader Fariba)
echo "Write an array inside a Function"
for i in "${guests[@]}"
do
echo "Welcome $i as a guest!"
done
}
welcome
-
مثال 14 - رشتهها را به هم متصل کنید
میتوان یک رشته را به رشته دیگری که به عنوان رشته پیوسته شناخته میشود، اضافه نمود. ما از یک متغیر چهارم برای به هم پیوستن سه متغیری که رشتهها را ذخیره میکنند استفاده مینمائیم.
در پایان میتوان رشته اضافه شده را خروجی گرفت.
#!/bin/bash
beginning="Hasan "
middle="was born in"
end=" Iran"
apendedvalue="$beginning$middle$end"
echo "$apendedvalue"
-
مثال 15 - طول یک رشته
این یک مثال ساده است که در آن میتوانیم فایل اسکریپت را نوشته و خروجی را دریافت کنیم. در اینجا، یک جمله را به یک متغیر اختصاص داده و طول آن را میشماریم.
#!/bin/bash
echo "Below is the sentence"
echo "+++++++++++++++++++++++"
echo
echo "how long is this sentence?"
echo
sentence="how long is this sentence?"
length=${#sentence}
echo "Length of the sentence is :- $length"
-
مثال 16 - یک رشته را پیدا و جایگزین کنید
اسکریپت bash توانایی یافتن و جایگزینی یک رشته در یک فایل را هم دارد. این اسکریپت امکان ویرایش ساده یک فایل را فراهم کرده و به کاربران امکان میدهد رشتهها را در صورت نیاز پیدا و جایگزین کنند.
با اجرای اسکریپت، یک فایل bash جدید ایجاد شده که رشته مشخص شده را با یک رشته جدید جایگزین مینماید و اطمینان حاصل میکند که اطلاعات موجود در فایل به روز و دقیق است.
ابزاری مفید برای کاربرانی که نیاز به تغییر فایلها دارند، بهویژه کسانی که تعداد زیادی فایل یا یک فرآیند در حال اجرا را مدیریت میکنند.
اسکریپت در bash نوشته شده است و میتواند به عنوان یک فایل bash مستقل اجرا شده یا در یک اسکریپت بزرگتر گنجانده شود که قدرت و تطبیق پذیری برنامه نویسی bash را نشان میدهد.
#!/bin/bash
echo "please enter a string"
read input
echo "Enter the word you need to replace -"
read rep
echo "enter the replacement"
read replacement
echo
echo "Replaced sentence - ${input/$rep/"$replacement"}"
-
مثال 17 - وجود یک فایل را بررسی کنید
اسکریپت زیر توانایی بررسی وجود یک فایل در سیستم را با استفاده از خط فرمان دارد. اسکریپت، ورودی کاربر را به شکل یک مقدار رشته گرفته که نشان دهنده نام فایلی است که باید بررسی شود.
با استفاده از دستور test اسکریپت میتواند به سرعت و به راحتی تشخیص دهد که آیا فایل وجود دارد یا خیر. اسکریپت نتیجه بررسی را با پیغام نشان میدهد و میتواند به عنوان یک فایل sh مستقل اجرا شده و یا در یک اسکریپت bash بزرگتر گنجانده شود.
استفاده از دستور test تضمین میکند که اسکریپت به طور یکپارچه در سیستمها و پلتفرمهای مختلف کار میکند که آن را به ابزاری عالی برای هر کاربر bash تبدیل مینماید.
#!/bin/bash
file=file2.txt
echo "whats inside this directory ?"
ls -l
echo
if [ -f "$file" ]
then
echo "$file exists"
else
echo "$file does not exist - creating the $file"
touch file2.txt
fi
echo "Whats inside this directory ?"
ls -l
-
مثال 18 - وضعیت دیسک
این اسکریپت bash با استفاده از دستور df -h جزئیات فضای دیسک در یک سیستم را نشان میدهد. اسکریپت از خط فرمان و دستورات bash برای جمع آوری سریع و آسان اطلاعات در مورد وضعیت دیسک استفاده مینماید.
با اجرای اسکریپت با دستور sudo، میتوان اطلاعات مربوط به فضای دیسک و استفاده از آن را حتی برای اجرای فرآیندها و فایلهایی که ممکن است متعلق به سایر کاربران باشد، انجام داد. این اسکریپت فایلی به نام disk_status.txt ایجاد کرده تا اطلاعات جمع آوری شده را ذخیره نماید و اطمینان حاصل کند که اطلاعات به راحتی قابل دسترسی است.
#!/bin/bash
df -h
-
مثال 19 - زمان به کارگیری سیستم و تاریخ جاری
این اسکریپت از دستورات uptime و date برای دریافت اطلاعات مربوط به زمان کارکرد سیستم و تاریخ فعلی استفاده میکند. اسکریپت با ایجاد یک متغیر رشته ای به نام today و تخصیص نتیجه دستور date به آن شروع میشود. سپس پیامی را ارسال میکند که شامل مقدار رشته today با متن SYSTEM UPTIME info - است.
با توانایی ایجاد فایلی به نام system_uptime.txt، کاربر حتی میتواند این اطلاعات را برای استفادههای بعدی ذخیره و اطمینان حاصل کند که کاربر نامعتبر به آن دسترسی ندارد.
#!/bin/bash
today=`date`
echo "SYSTEM UPTIME info - $today"
echo "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++"
uptime
-
مثال 20 - شمارش تعداد فایلها
اسکریپت bash زیر توانایی شمارش تعداد فایلهای داخل یک دایرکتوری را نشان میدهد. این یک کار مهم برای هر کاربر لینوکس است، زیرا امکان میدهد محتویات یک دایرکتوری را نظارت و اطمینان حاصل کنید که فقط یک کاربر معتبر به فایلهای داخل آن دسترسی دارد.
این اسکریپت ابتدا از دستور ls -l برای فهرست کردن فایلها در دایرکتوری، از جمله مجوزهای آنها و شناسه فرآیند مالک فایل استفاده میکند. سپس از کاربر میخواهد که پاسخ دهد how many files are here? و از دستور ls -l * | wc -l برای شمارش تعداد فایلها، از جمله هر فایل متنی استفاده مینماید.
#!/bin/bash
ls -l
echo "how many files are here?"
ls -l * | wc -l
اگر کارهای معمولی و روتین روی سیستم لینوکس خود دارید، انجام یک کار یکسان و مکرر خسته کننده و وقت گیر خواهد بود. اینجاست که به کمک برنامه نویسی bash میتوانید تمام آن دستورات ترمینال را در یک فایل اسکریپت نوشته و در صورت امکان آنها را اجرا کنید و نیازی به تایپ هر دستور از ابتدا نیست؛ علاوه بر این، به راحتی میتوان فایلهای اسکریپت را به اشتراک گذاشت که باعث صرفه جویی در زمان و انرژی خواهد شد.