Как сделать многосимвольный параметр в UNIX с помощью getopt?
Я пытаюсь сделать команду getopt таким образом, что когда я передаю параметр "-ab" на script,
что script будет обрабатывать -ab как единственный параметр.
#!/bin/sh
args=`getopt "ab":fc:d $*`
set -- $args
for i in $args
do
case "$i" in
-ab) shift;echo "You typed ab $1.";shift;;
-c) shift;echo "You typed a c $1";shift;;
esac
done
Однако это не работает. Может ли кто-нибудь помочь?
Ответы
Ответ 1
getopt не поддерживает то, что вы ищете. Вы можете использовать однобуквенные (-a
) или длинные опции (--long
). Что-то вроде -ab
обрабатывается так же, как -a b
: как опция a
с аргументом b
. Обратите внимание, что длинные параметры имеют префикс двумя тире.
Ответ 2
я долго боролся с этим - потом я начал читать о getopt и getopts
одиночные варианты символов и длинные варианты.
У меня было похожее требование, когда мне нужно было иметь несколько входных аргументов для нескольких символов.
Итак, я придумал это - это сработало в моем случае - надеюсь, это поможет вам
function show_help {
echo "usage: $BASH_SOURCE --input1 <input1> --input2 <input2> --input3 <input3>"
echo " --input1 - is input 1 ."
echo " --input2 - is input 2 ."
echo " --input3 - is input 3 ."
}
# Read command line options
ARGUMENT_LIST=(
"input1"
"input2"
"input3"
)
# read arguments
opts=$(getopt \
--longoptions "$(printf "%s:," "${ARGUMENT_LIST[@]}")" \
--name "$(basename "$0")" \
--options "" \
-- "[email protected]"
)
echo $opts
eval set --$opts
while true; do
case "$1" in
h)
show_help
exit 0
;;
--input1)
shift
empId=$1
;;
--input2)
shift
fromDate=$1
;;
--input3)
shift
toDate=$1
;;
--)
shift
break
;;
esac
shift
done
Примечание. Я добавил функцию справки в соответствии с моим требованием, при необходимости вы можете удалить ее
Ответ 3
Это не способ Unix, хотя некоторые делают это, например, java -cp classpath
.
Hack: вместо -ab arg
, есть -b arg
и фиктивная опция -a
.
Таким образом, -ab arg
делает то, что вы хотите. (-b arg
тоже будет; надеюсь, что это не ошибка, а функция ярлыка...).
Единственное изменение - ваша строка:
-ab) shift;echo "You typed ab $1.";shift;;
становится
-b) shift;echo "You typed ab $1.";shift;;
Ответ 4
getopt поддерживает длинный формат. Вы можете найти SO для таких примеров.
См. здесь, например