我正在尝试创建一个getopt命令,这样当我将“-ab”参数传递给脚本时, 该脚本将-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
但是,这似乎不起作用。任何人都可以提供任何帮助吗?
答案 0 :(得分:12)
getopt不支持你要找的东西。您可以使用单字母(-a
)或长选项(--long
)。 -ab
之类的内容与-a b
的处理方式相同:选项a
,参数b
。请注意,长选项以两个破折号为前缀。
答案 1 :(得分:0)
我为此一直苦苦挣扎-然后我开始阅读有关getopt和getopts的文章
单字符选项和长选项。
在需要多个multichar输入参数的地方,我有类似的要求。
所以,我想出了这一点-在我的情况下有效-希望这对您有帮助
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 "" \
-- "$@"
)
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
注意-我已根据需要添加了帮助功能,您可以在不需要时将其删除
答案 2 :(得分:0)
这不是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;;
答案 3 :(得分:-3)