getopt تابعی در کتابخانه استاندارد پازیکس برای تجزیه کردن گزینههای خط فرمانی (به انگلیسی: command line options) است (در بعضی از سیستمعاملها از کلمه «سوئیچ» به جای «گزینه» استفاده میشود). همچنین در یونیکس برنامهای مشابه و هم نام برای دریافت گزینههای خط فرمانی در شل اسکریپتها وجود دارد. در زمانهای قدیم برنامههای خط فرمانی هر کدام از روش مخصوص به خود برای دریافت گزینههای خط فرمان استفاده میکردند. تابع getopt با هدف ایجاد یک روش استاندارد برای تجزیه کردن این گزینهها نوشته شد. علاوه بر زبان سی این تابع در اکثر زبانهای برنامهنویسی مانند پایتون، پیاچپی، جاوا و ... هم پیادهسازی شدهاست. برای استفاده از این تابع در زبان سی، برنامه باید قابلیت دریافت آرگومانها را داشته باشد. بنابراین تابع main باید بدین صورت اعلان شود:
int main(int argc, char *argv[])
argv اشاره گری است به آرایهای از اشارهگرهای کاراکتری. argc هم تعداد آرگومانها را نگه میدارد.
getopt در فایل unistd.h تعریف شدهاست. شکل اعلان این تابع بدین شکل است:
int getopt(int argc, char * const argv[], const char *optstring);
argv و argc باید برای تابع getopt ارسال شوند. argv لیست آرگومانهایی است که کاربر در خط فرمان وارد کردهاست. optstring هم گزینههای مجاز و تعریف شده برنامه را نشان میدهد. getopt در هر بار اجرا argv را برای پیدا کردن گزینههای کاراکتری مجاز و شناخته شده جستجو میکند. یک کاراکتر به عنوان گزینه مجاز در نظر گرفته میشود، اگر در رشته optstring وجود داشته باشد. از آنجا که getopt در هر بار اجرا تنها میتواند یکی از گزینهها را پردازش کند، باید آن را در یک حلقه تکرار استفاده کرد. مقدار برگشتی تابع getopt چند حالت مختلف دارد. اگر getopt موفق شود یکی از گزینههای مشخص شده در optstirng را در argv پیدا کند، همان گزینه را برمیگرداند. اگر getopt با گزینه تعریف نشدهای روبرو شود، کاراکتر علامت سؤال (؟) را برمیگرداند. پس از پایان پردازش گزینهها، مقدار -1 برخواهد گشت.
رشته optstring میتواند حاوی این موارد باشد:
- کاراکترهای رایج مانند a, b, ،x, y و ...
- کاراکتری که پس از آن کولن (:) قرار دارد.
اگر پس از کاراکتر کولن (:) آمده باشد، یعنی اینکه آن گزینه یک آرگومان اضافه هم در خط فرمان میگیرد. برای مثال رشته "x" گزینه "x-" را شناسایی میکند و رشته ":x" هم "-x argument" را شناسایی میکند. آرگومان آن گزینه در متغیر optarg ذخیره میشود.
#include <unistd.h>
int bflag, ch, fd;
bflag = 0;
while ((ch = getopt(argc, argv, "bf:")) != -1) {
switch (ch) {
case 'b':
bflag = 1;
break;
case 'f':
if ((fd = open(optarg, O_RDONLY, 0)) <0) {
(void)fprintf(stderr,
"myname: %s: %s\n", optarg, strerror(errno));
exit(1);
}
break;
case '?':
default:
usage();
}
}
argc -= optind;
argv += optind;
منابع
http://www.freebsd.org/cgi/man.cgi?query=getopt&sektion=3&apropos=0&manpath=FreeBSD+9.1-RELEASE