آموزش اسکریپت نویسی bash در حد متوسط
با سلام به همه دوستان
اول باید بگم این آموزش برای کاربران لینوکسه.کاربران ویندوز نمیتونند با این آموزش ارتباط برقرار کنن.(منظورم سیستم عامل کامپیوتر شما نیست طرز فکر شماست)
در اهمیت اسکریپت نویسی همین قدر بگم که اکثر لینوکس سرورها اصلا محیط دسکتاپ ندارند و مدیران از خط فرمان و معمولا اسکریپتها اونها رو اداره میکنند.
پیشنیاز دنبال کردن این تاپیک اینه که شما باید بتونید جملات ساده انگلیسی رو ترجمه و درک کنید(کاربران لینوکس مسلما میتونند)
خوب بهترین راه برا آموزش دنبال کردن خط به خط یه اسکریپت ساده است.اسکریپت زیر در سیستم من برای دانلود شبانه استفاده میشه(اعداد شماره خط رو بیان میکنن و جزء اسکریپت نیستند) :
کد:
1 #!/bin/bash
2 logfile="/home/ahmad/Desktop/aria2.log"
3 let bash_ver=${BASH_VERSINFO[0]} &>/dev/null
4 if [ "${bash_ver}" -lt 4 ];then
5 echo -e "`date +"%A %d %B %Y %R"`\t FATAL ERROR. Bash Shell Is Old Version And Not Compatible" | tee -a "$logfile" 2> /dev/null
6 exit 1
7 fi
8 unset OS_TYPE
9 OS_TYPE="`grep -Eio "arch |fedora " /etc/issue 2>/dev/null | tr "[:upper:]" "[:lower:]" 2>/dev/null | tr -d ' \n'`"
10 if [ "x${OS_TYPE}" == "x" ];then
11 if [[ ! -z "`grep -Eio '\$FreeBSD:' /etc/sysctl.conf`" || ! -z "`grep -Eio '\$FreeBSD:' /etc/defaults/rc.conf`" ]];then
12 OS_TYPE=freebsd
13 echo -e "`date +"%A %d %B %Y %R"`\t FATAL ERROR: FreeBSD Not implemented yet" | tee -a "$logfile"
14 exit 1
15 else
16 echo -e "`date +"%A %d %B %Y %R"`\t FATAL ERROR: OS Type Not Recognized Properly" | tee -a "$logfile"
17 exit 1
18 fi
19 fi
20 case $OS_TYPE in
21 "fedora")
22 rpm -q aria2 &>/dev/null
23 ERRORCODE=$?;;
24 "arch")
25 pacman -Q --noconfirm aria2 &>/dev/null
26 ERRORCODE=$?;;
27 *)
28 echo -e "`date +"%A %d %B %Y %R"`\t FATAL ERROR: OS Type '${OS_TYPE} not implemented yet'" | tee -a "$logfile"
29 exit 1;;
30 esac
31 [ $ERRORCODE -ne 0 ] && { echo "aria2 not installed in `uname -n`" | tee -a "$logfile" 2> /dev/null; exit 2; }
32 aria2_main="`which aria2c 2> /dev/null`"
33 if [[ -z "${aria2_main}" ]];then
34 echo -e "`date +"%A %d %B %Y %R"`\t FATAL ERROR. aria2c binary file Not Found In `uname -n`" | tee -a "$logfile" 2> /dev/null
35 exit 2
36 fi
37 let ERRORCODE=1
38 COOKIES="`{ \cp -f $(find "$HOME" -name "cookies.sqlite" 2> /dev/null | grep "mozilla") /tmp;echo /tmp/cookies.sqlite; }`"
39 while [ $ERRORCODE -ne 0 ];
40 do
41 [ ! -f "${COOKIES}" ] && COOKIES="`{ \cp -f $(find "$HOME" -name "cookies.sqlite" 2> /dev/null | grep "mozilla") /tmp;echo /tmp/cookies.sqlite; }`"
42 let stop=$((28200-((`date +"%H"`*60*60)+(`date +"%M"`*60))))
43 if [[ "$1" == "skip" ]];then
44 stop=0
45 else
46 [ ${stop} -le 0 ] && break
47 fi
48 ${aria2_main} --input-file=/home/ahmad/Desktop/downlist.txt --log=${logfile} --log-level=notice --retry-wait=1 --max-tries=0 --max-concurrent-downloads=2 --split=4 --max-connection-per-server=1 --connect-timeout=600 --enable-dht --stop=${stop} --file-allocation=prealloc --parameterized-uri=true --check-certificate=false --check-integrity=true --dir=/big-download --load-cookies="${COOKIES}"
49 ERRORCODE=$?
50 done
خط اول رو بهش میگن شی بنگ shebang
به مفسر میگه این فایل اسکریپت رو چه نرم افزاری(چه مفسری) باید اجرا کنه چون ما اسکریپت bash مینویسیم باید به صورت زیر باشه :2 تا کاراکتر #! و بلافاصله مسیر مفسر bash و در صورت نیاز آرگومانهایی که باید به مفسر فرستاده بشند.شی بنگ رو میشه به صورت دیگری هم نوشت که دیگه وارد جزییات نمیشم.
تو 2 خط بعدی 2 متغیر تعریف شدند.یه متغیر رشته ای به نام logfile و یه متغیر عددی به نام bash_ver.برای تعریف متغیر عددی bash_ver از دستوری به نام let پیش از نام متغیر استفاده کرده ام.بدون let هم این تعریف درست عمل میکند.پس چرا از let استفاده کرده ام.اگر در محاسبه مقدار عددی هر اشتباهی صورت گیرد متغیر bash_ver با وجود let با صفر مقداردهی میشود.اما اگر let نبود در صورت بروز اشتباه bash_ver تبدیل به یک متغیر رشته ای میشد که باعث بروز اشتباه در دستور خط بعد آن میشد.دستور let جلوی تبدیل متغیر را میگیرد و تضمین میکن bash_ver عدد خواهد بود.ضمنا با وجود let میتوان از برخی عبارات محاسباتی مستقیما استفاده کرد.
برای تعریف متغیرهای رشته ای(در اینجا logfile) ترجیحا از علامت نقل قول(double quato) یا single quato باید استفاده کرد.
در انتساب به مغیرها بعد از علامت تساوی نباید خط فاصله باشد.در انتساب عددی bash_ver بلافاصله بعد از علامت تساوی علامت $ را میبینیم.علامت $ یعنی متغیری وجود دارد که میخواهیم به مقدار آن دست پیدا کنیم.این متغیر {BASH_VERSINFO[0]} میباشد.اما این چه متغیری است؟.(علامتهای {} جزو نام متغیر نمیباشند و در بسیاری موارد اختیاری میباشند اما شما همیشه از آکولاد استفاده کنید)
یا خود ما متغیرها را تعریف و استفاده میکنیم یا متغیرهایی از قبل وجود دارند که ما از مقادیر آنها بهره میبریم.bash آرایه ای به نام BASH_VERSINFO دارد که اطلاعات نسخه آن را ذخیره میکند.عنصر اول آرایه(همان عنصر 0) شماره ورژن اصلی را در خود دارد.یعنی ما با این دستور انتساب شماره ورژن اصلی bash را در متغیر bash_ver قرار میدهیم.
در پایان خط دستور انتساب عددی داریم خوب علامت < یک ریدایرکتور است.بدین معنی که خروجی و حاصل عبارت سمت چپ خود را به دستور و یا عبارت سمت راست منتقل میکند.کلیه خروجی ایجاد شده دستور انتساب سمت راست ریدایرکتور به device بخصوصی به نام null میریزد.null یعنی هیچی یعنی خروجی مورد نظر را نابود کن.من با قرار دادن این ریدایرکتور به null در انتهای دستور میخواهم در صورت بروز اشتباه هیچ خروجی روی صفحه نمایش دیده نشود.علامت & معنی به خصوصی دارد که بایستی با مقدمات لازمی توضیح دهم.ما ۳ device بخصوص داریم به نامهای stdin یا ورودی استاندارد که با عدد صفر مشخص میشود.stdout یا خروجی استاندارد که با عدد 1 مشخص میشود و stderr یا اشتباه استاندارد که با عدد 2 مشخص میشود.با ریدایرکتورها میتوان این ورودیها و خروجیها را که دستورات تولید میکنند منتقل کرد.
ورودی استاندارد معمولا صفحه کلید است اما میتواند یک سخت افزار ورودی دیگر یا حتی خروجی یک دستور دیگر یا محتویات فایل باشد.خروجی استاندارد معمولا صفحه نمایش است.مثلا وقتی دستوری تایپ میکنیم نتیجه آن را در صفحه نمایش میبینیم.ممکن است خروجی استاندارد نیز تغییرکند.اشتباه استاندارد نیز معمولا به صفحه نمیش یا log فایلها متصل میشود.
علامت & چسبیده به ریدایرکتور < یعنی تمام این خروجی ها فرستاده شود.به جای & میتوان از اعداد 1 یا 2 استفاده کرد.2 یعنی خروجی خطا و 1 یعنی خروجی معمولی(استاندارد)
خوب در خط 4 تا 7 یه دستور شرطی ساده داریم. دستور if یعنی اگر،یک خط فاصله و سپس دستور ] و سپس یک خط فاصله بعد از اون کل عبارتی که باید محاسبه بشه یک فاصله علامت [ سپس بلافاصله علامت ; دستور then به معنی سپس، عباراتی که در صورت درست بودن شرط if اجرا میشند ود در نهایت با دستور fi دستور پایان میپذیرد.عبارتی که در دستور if درستی یا نادرستی اون برسی میشه یک مقایسه عددی هست به صورت زیر :
متغیر bash_ver که ایجاد کردیم در اینجا با یه علامت $ که اولش اومده جایگزین میشه یه عملگر به صورت lt- بررسی میکنه که مقدار این متغیر کوچکتر از 4 هست یا نه.lt مخفف lesser then به معنی کوچکتر از میباشد.
اگر مقدار مقدار متغیر bash_ver کوچکتر از 4 باشد دستورات پس از then اجرا میشند.در غیر اینصورت مفسر از روی این دستورات پرش میکنه و به خط 8 میره.به طور خلاصه این دستور if برسی میکنه اگر ورژن bash قدیمیتر از ورژن 4 باشه یک پیغام خطا چاپ کنه و به اجرای اسکریپت خاتمه بده در غیر اینصورت اسکریپت به اجرای معمول خودش ادامه بده.
دستورات شرطی ابزار تصمیم گیری و تغییر جهت اجرای برنامه هستند و از مهمترین ابزارهای اسکریپت نویسی هستند.در واقع منطق اسکریپت رو مشخص میکنن.
ادامه دارد ....