我正在编写一个 Bash 脚本来解析命令行选项,然后执行所需的功能。
#!/bin/bash
TEMP=`getopt --longoptions help --options h --name 'script.sh' -- "$@"`
if [ $? != 0 ] ; then
echo "Try 'script.sh --help' for more information." >&2 ;
exit 1 ;
fi
eval set -- "$TEMP"
while true ; do
case "$1" in
-h|--help)
echo "Usage:";
exit 0;;
--)
shift ;
break ;;
*)
echo "Internal error!" ;
exit 1 ;;
esac
done
echo "Remaining arguments:"
for arg do
echo '--> '"'$arg'" ;
done
./script.sh --
输出
Remaining arguments:
所有的
./script.sh --h
./script.sh --he
./script.sh --hel
./script.sh --help
输出
Usage:
和./script.sh --helps
输出
script.sh: unrecognized option '--helps' Try 'script.sh --help' for more information.
如何防止截断的选项被识别为完整选项?我在 Bash 模式中找不到任何类似“字符串结尾”的内容。为什么没有--
被检测为开头--help
?
答案1
从人getopt:
长选项可以缩写,只要缩写不产生歧义即可。
因此,只要缩写不会引起歧义,就会被缩写。您可以添加其他选项使其引起歧义:
TEMP=`getopt --longoptions help helpx --options h --name 'script.sh' -- "$@"`
会给你类似这样的信息:
./script.sh --he
script.sh: option '--he' is ambiguous; possibilities: '--help' '--helpx'
Try 'script.sh --help' for more information.
答案2
您不应该以更通用的方式处理选项,而应该关心您感兴趣的选项:
for i in "$@"; do
case "$i" in
-h|--help)
echo "usage"
exit 0
;;
--one|--two|--tree)
continue
;;
*)
echo "error"
exit 1
;;
esac
done