خوب دوستان
همونجوری که دیدید ilius جان بحث جالبی رو مطرح کردند که خیلی جالب بود (واقعا لذت بردم)
در ادامه بحث (و منتظر ماندن برای نکته های جالب تر از طرف ایشون و سایر دوستان) بحث رو به سمت یک مثال از متغیر های پارامتری هدایت میکنم
این متغیر ها - متغیرهایی هستند که به عنوان آرگومان به فایل یا بهتر بگم اسکریپت شما داده میشن
لذا برای تست کردن این متغیر ها و امتحان اونها حتما باید اسکریپت بنویسید و نمیشه اونها رو در خود شل مستقیما تایپ کرد(البته بسته به مثال هم هست
) اولین مثال برای تفاوت $@ و $* هستش که در همون ترمینال تایپ کنید و دومی یک اسکریپت
IFS=''
set foo bat bam
echo "$@"
echo "$*"
حالا مقدار IFS رو از بین میبریم و دوباره تست میکنیم
unset IFS
echo "$*"
در اینجا باید با توجه به فرمایشات ilius جان به نقش نقل قول دوتایی و تفاوت بین $* و $@ توجه کنید
حالا برای مثال دوم اسکریپت زیر رو بسازید
#!/bin/sh
salutation="Hello"
echo $salutation
echo "the program $0 is now running"
echo "The second parameter is $2"
echo "The first parameter is $1"
echo "The parameter list is $*"
echo "The user's home directory is $HOME"
echo "Please enter the new greeting"
read salutation
echo $salutation
echo "The script is now complited"
exit 0
حالا فرض کنید که این اسکریپت رو شما با یک اسمی در یک داریکتوری سیو کردید
با فرض اینکه نام فایل شما myfile باشه و هم اکنون با محیط متنی (ترمینال) با دایرکتوری مورد نظر cd کرده باشید دستور زیر رو اجرا کنید
./myfile foo bar baz
به خروجی دقت کنید!!!!
اگر نام فایل شما تغییر کنه کجای خروجی تغییر میکنه؟
شما میتونید نام فایل اسکریپت رو در یک متغیر داشته باشید.نام اون متغیر چیه؟
در حین اجرا از شما یک مقدار گرفته میشه(read) فقط قصد من این بود که مطالب پست های قبلی رو تکرار کنیم تا یادمون نره (استفاده از متغیر ها و مفهوم اون)
حالا یک سر فصل جدید رو آغاز میکنیم
دستو test یا ]
به صورت تجربی اکثر اسکریپت های جدی از یکی از این دو دستور استفاده میکنن (تست منطقی در شل)
در اکثر سیستمها این دو دستور هم معنی هستند غیر از جاهایی که دو کاراکتر [ و ] در ادامه همدیگه و به دنبال هم بیان که در این صورت فقط برای خوانایی استفاده شدند و نه بیشتر
ممکنه استفاده از کاراکتر ] کمی عجیب و نا مانوس باشه اما در داخل کد باعث خوانایی بیشتر کد میشه!!!!
دستور زیر رو لطفا در ترمینال و با دسترسی رووت اجرا کنید
ls -l /usr/bin/[
نکته ای که در اینجا مهمه اینه که همونجوری که متوجه شدید test یک دستوره
بعضی از دوستان که تازه شروع به اسکریپت نویسی کردند به اشتباه اسم اسکریپت خودشون رو test میذارند و مستقیقا در ترمینال تلیپ میکنند test که اجرا بشه
اما در اینجا مشکلی پیش میاد براشون که نمیدونن کدوم test داره اجرا میشه
اگر در $PATH شما مقدار نقطه (. = دات) رو داشته باشد بهتر متوجه این مشکل میشید و در غیر این صورت حتما اونی اجرا میشه که مد نظر شما نیشت
برای اطمینان از اجرای صحیح فایل مورد نظر در این مورد باید عبارت زی رو تایپ کنید (با آدرس مطلق یا نسبی)
./test
به عنوان ادامه بحث فرض بر این است که وجود یا عدم وجود یک فایل خاص برای اسکریپت شما خیلی مهمه و قصد دارید که وجود این فایل رو چک کنید
باید از دستور test استفاده کنید
test -f <filename>
if test -f fred.c
then
....
fi
این کد با کد زیر برابره
if [ -f fred.c ]
then
....
fi
دقت کنید که بین ] و عبارتی که باید چک بشه حتما باید از یک فاصله استفاده کرده باشید. شما میتونید این مفهوم رو به این صورت به خاطر بسپارید که ] دقیقا معادل با تایپ کردن عبارت test هستش و همونجوری که بعد از test یک فاصله وجود داره پس بعد از ] هم یک فاصله باید وجود داشته باشه
نکته دیگه اینکه اگر دوست دارید که then رو در همون خطی که if قرار داره تایپ بکنید باید با یک ; به سیستم بفهمونید که then جدای از test هستش
if [ -f fred.c ] ; then
....
fi