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"‎ بنویسیم.

Steve Parker  نوشته  Bourne و Bash راهنمای آموزشی اسکریپت نویسی
لطفاً برای بهتر دیدن صفحه از فایرفاکس استفاده کنید