Коли ви пишете біт аналізу коду командного рядка вашого коду, ви вказуєте, які параметри беруть аргументи, а які ні. Наприклад, у скрипті оболонки, який приймає -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
виклику старих варіантів стилів для "пакетних прапорів".