Коли ви пишете біт аналізу коду командного рядка вашого коду, ви вказуєте, які параметри беруть аргументи, а які ні. Наприклад, у скрипті оболонки, який приймає -hпараметр (наприклад, довідку) та -aпараметр, який повинен брати аргумент, ви робите
opt_h=0 # default value
opt_a=""
while getopts 'a:h' opt; do
case $opt in
h) opt_h=1 ;;
a) opt_a="$OPTARG" ;;
esac
done
echo "h: $opt_h"
echo "a: $opt_a"
a:hТрохи говорить : «Я очікую , щоб розібрати два варіанти, -aі -h, і -aповинен приймати аргумент» (це :після того, aщо говорить парсер , який -aприймає аргумент).
Тому ніколи не виникає двозначності в тому, де закінчується варіант, де починається його значення і де починається інший після цього.
Запуск:
$ bash test.sh -h -a hello
h: 1
a: hello
$ bash test.sh -h -ahello
h: 1
a: hello
$ bash test.sh -hahello
h: 1
a: hello
Ось чому ви більшу частину часу не повинні писати власний аналізатор командного рядка для розбору варіантів.
На цьому прикладі є лише один випадок, який хитрий. Розбір зазвичай зупиняється на першою не-опції, тому якщо у вас є речі в командному рядку , яка виглядає як варіанти:
$ bash test.sh -a hello -world
test.sh: illegal option -- w
test.sh: illegal option -- o
test.sh: illegal option -- r
test.sh: illegal option -- l
test.sh: illegal option -- d
h: 0
a: hello
Наступне вирішує, що:
$ bash test.sh -a hello -- -world
h: 0
a: hello
Ці --сигнали кінець параметрів командного рядка, а -worldбіт залишається для програми , щоб зробити все , що хоче з (це в одній з позиційних змінних).
Тобто, до речі, як ви видалите файл, який має тире на початку свого імені файлу rm.
Редагувати :
Утиліти, написані на C-виклику getopt()(оголошені в unistd.h), які працюють майже так само. Насправді, наскільки ми знаємо, bashфункція getoptsможе бути реалізована за допомогою виклику функції C бібліотеки getopt(). У Perl, Python та інших мовах є аналогічні бібліотеки розбору командних рядків, і найімовірніше, що вони виконують їх аналіз аналогічним чином.
Деякі з цих getoptта getoptподібних процедур бібліотеки також обробляють "довгі" параметри. Вони , як правило , передує подвійним тир ( --) і довгими варіантами , які приймають аргументи часто робить це після знака рівності, наприклад --block-size=SIZEваріанту [деякі реалізації] в duкорисності (яка також дозволяє -B SIZEвказати те ж саме).
Причини посібників часто написані, щоб показати пробіл між короткими варіантами та їх аргументами, ймовірно, для читабельності.
EDIT : Дійсно старі інструменти, такі , як ddі tarутиліти, є варіанти без тиру перед ними. Це виключно з історичних причин та для підтримки сумісності з програмним забезпеченням, яке покладається на них, щоб вони працювали саме таким чином. tarУтиліта отримала можливість приймати варіанти з прочерками в більш пізні часи. Посібник BSD для tarвиклику старих варіантів стилів для "пакетних прапорів".