در برنامههای خط فرمانی cli کاربر با استفاده از پارامتر با برنامه و یا اسکریپت ارتباط برقرار میکنه بنابراین یکی از اولین قدمهای نوشتن یک اسکریپت حرفهای اینه که پارامترهای ارسال شده به اسکریپت رو بصورت کاملا حرفهای بررسی کنید. دستور getopts یکی از برنامههای خیلی خوب برای مدیریت پارامترهای ارسالی به اسکریپته که به زیباترین شکل ممکن آپشنهای را بررسی و پارس میکنه. اما قبل از بررسی این دستور بهتره تا حدودی با پارامترهای ارسالی به برنامههای cli آشنا بشیم.
در لینوکس پارامترهایی که به یک دستور یا اسکریپت بش ارسال میکنیم به سه صورت میتونه باشه.
آپشنهای تک کاراکتری ( single-character options) مثل -a در دستور ls
آپشنهای طولانی سبگ گنو (GNU-style long option) مثل - -all
آپشنهای طولانی سبک XF86 یا (XF86-style long options) مثل -all
برنامه getops قادر به بررسی آپشنهای طولانی سبگ گنو و آپشنهای طولانی سبک XF86 نیست و فقط میتونه پارامترهای رو به شکل تک حرفی ببینه.
این مثالها رو در نظر بگیرید.
ls -las ls -l -a -s ls -la -s ls -l -as
همونطور که میدونید این چهار دستور یک نتیجه رو باید نشان بده یعنی چه آرگومانها به هم چسبیده باشند و چه جدا باشند نتیجه باید ثابت باشه! خوب کاملا مشخصه که بررسی حالتهای مختلفی که ممکنه پارامترها به یک دستور ارسال بشه کار فوق العاده سختی میتونه باشه و اینجاست که دستور getopts به کمک ما میاد.
این کد رو یک نگاهی بهش بکنید تا ببینیم چجوری باید از getopts استفاده کنیم.
#!/bin/bash while getopts \"abc:d:\" OPTION ; do case $OPTION in # help a) echo \"a!\" ;; b) echo \"b!\" ;; c) echo \"c = $OPTARG\" ;; d) echo \"d = $OPTARG\" esac done
از اونجا که پارامترهای ارسالی به اسکریپت ما ممکنه بیش از یکی باشه از یک حلقه while استفاده میکنیم تا تک تک پارامترها رو بررسی کنیم
while getopts \"abc:d:\" OPTION ; do
عبارت abc:d: به getopts میگه که پارامترهای اسکریپت اینهاست
- -a
- -b
- -c param
- -d param
حرف a به تنهایی حرف b به تنهایی حرف c به همراه یک پارامتر و بلاخره حرف d به همراه یک پارامتر اضافه! توجه دارید که هر دو نقطه جلوی یک پارامتر به معنی یک پارامتر اضافه است! در هر بار اجرای getopts یکی از پارامترهای ارسالی به اسکریپت خونده میشه و توی متغییر OPTION ریخته میشه و ما با استفاده از یک حلقه case این پارامترها رو دونه دونه بررسی میکنیم! اگه پارامتر اضافهای داشته باشیم توی متغییر OPTARG ریخته میشه.
اگر اسکریپت رو با همراه پارامترها اجرا کنیم نتیجه این خواهد بود.
$ ./bash.sh -ab -c param1 -dparam2 a! b! c = param1 d = param2