10. متغیرها - قسمت دوم
متغیرهایی وجود دارند که قبلاًبرای شما تنظیم گردیدهاند، اکثر آن ها را نمیتوان مقداردهی نمود.این متغیرها شامل اطلاعات مفیدی میباشند، که میتوان از آن ها دراسکریپت، جهت آگاهی از محیطی که اسکریپت در آن اجرا شده، استفاده نمود.
اولین گروه از متغیرهایی که به آن ها میپردازیم $0 .. $9
و $#
میباشند.
متغیر $0
نام( basename ) برنامهای که فراخوانده شده است، میباشد.
$1 $2 $3 .... $9
۹ پارامتر اضافی هستند، که اسکریپت با آنها فراخوانی شدهاست.
متغیر $@
تمام پارامترهای $3 $2 $1 ... هر قدر
را در بر میگیرد.
متغیر $*
، مشابه قبلی است، اما با حفظ فاصله میان آن ها و نقلقولی کردن، بنابراین "File with spaces" به صورت "File" "with" "spaces" تبدیل میشود. این مشابه دستور echo
است، موضوعی که ما در بخش اولین اسکریپت به آن پرداختیم.
مطابق یک قاعده کلی از $@
استفاده کنید و از $*
اجتناب نمایید.
$#
در بر دارنده تعداد پارامترهایی که اسکریپت با آنها فراخوانی شده، میباشد.
اجازه دهید یک اسکریپت مثال بزنیم:
var3.sh
#!/bin/sh echo "I was called with $# parameters" echo "My name is $0" echo "My first parameter is $1" echo "My second parameter is $2" echo "All parameters are $@"
بیاید نگاهی به اجرای این کد وخروجی آن داشته باشیم:
$ /home/steve/var3.sh I was called with 0 parameters My name is /home/steve/var3.sh My first parameter is My second parameter is All parameters are $ $ ./var3.sh hello world earth I was called with 3 parameters My name is ./var3.sh My first parameter is hello My second parameter is world All parameters are hello world earthتوجه نمایید که مقدار متغیر
$0
به نسبت چگونگی فراخوانی اسکریپت تغییر میکند. برنامه خارجی سودمند basename
میتواند این مورد را مرتب نماید:
echo "My name is `basename $0`"
$#
و $1 .. $2
به طور خوکار توسط پوسته مقداردهی میشوند.
میتوانیم بیش از ۹ پارامتر با استفاده ازفرمان
shift
به کار ببریم، به اسکریپت زیر نگاه کنید:
var4.sh
#!/bin/sh while [ "$#" -gt "0" ] do echo "\$1 is $1" shift done
این اسکریپت تا موقعی که مقدار متغیر
$#
به زیر صفر برسد، که در آن نقطه لیست پارامترها تهی است، دستور shift
را روشن نگه میدارد.
$?
یک متغیر ویژه دیگراست. این متغیر محتوی کد خروج آخرین فرمان اجرا شده است. این چنین:
#!/bin/sh /usr/local/bin/my-command if [ "$?" -ne "0" ]; then echo "Sorry, we had a problem there!" fi
این متغیر سعی میکند برنامه /usr/local/bin/my-command
را اجرا کند، که اگر همه چیز درست پیش برود با مقدار صفر و در صورت شکست با مقدار غیر صفر خارج میشود.
سپس با کنترل مقدار $?
بعد از فراخوانی دستور، مدیریت میکنیم. این امر اسکریپت را قوی وهوشمندتر مینماید.
برنامههای خوشرفتارباید در موفقیت صفر را بازگردانند.از اینرو نقلقول:
یکی از دلایل سقوط تمدن رم،فقدان صفر بود، آنها راهی برای نشان دادن پایان موفقیت آمیز برنامههای C خودشان نداشتند. (Robert Firth)
دو متغیر اصلی دیگر که توسط محیط برای شما تنظیم گردیده $$
و $!
میباشند. آنها هر دو شماره پردازش هستند.
متغیر $$
محتوی PID (شناسه پردازش ) پوسته در حال اجرا میباشد.
این برای ایجاد فایلهای موقتی میتواند مفید باشد، مانند
/tmp/my-script.$$
که اگر نمونههای متعددی از اسکریپت به طور همزمان در حال اجرا باشند، میتواند برای آن که هر کدام فایلهای موقت مخصوص به خود راداشته باشند ،مفید واقع گردد.
متغیر $!
محتوی PID آخرین پردازش اجرا شده در پسزمینه است.
این برای دنبال کردن پردازش همان طور که کارش را پیش میبرد، مفید است.
یک متغیر جالب توجه دیگر IFS
میباشد. این متغیر جداکننده داخلی فیلد میباشد. مقدار پیشفرض آن SPACE TAB NEWLINE
است،
اما اگر میخواهید آن را تغییر دهید،بهتر است به طریقی که نشان داده شده،یک کپی از آن تهیه کنید:
var5.sh
#!/bin/sh old_IFS="$IFS" IFS=: echo "Please input three data separated by colons ..." read x y z IFS=$old_IFS echo "x is $x y is $y z is $z"
این اسکریپ به این شکل اجرا میشود:
$ ./ifs.sh Please input some data separated by colons ... hello:how are you:today x is hello y is how are you z is today
وقتی به طور خاص بامتغیر IFS
سر و کار دارید ( اما به طور کلی هر متغیری که کاملاً تحت کنترل شما نیست ) متوجه باشید که میتواند شامل فاصله، سطر جدید و سایر کاراکترهای غیر قابل کنترل باشد. وبه همین خاطر است که استفاده از نقلقولهایدوتایی در اطراف آن، ایده بسیار خوبی میباشد، یعنی: به جای نوشتن old_IFS=$IFS
بهتر است اینطور old_IFS="$IFS"
بنویسیم.