bash脚本选项解析器失败



我有一个bashscript.sh,它是$ chmod +x bashscript.sh,并将它移动到$ mv bashscript.sh ~/.local/bin/,以便它可以像系统命令一样执行。

我希望能够用调用它

bashscript [<-w|-working|--working>[=|:]] <y|yes|n|no> 

如果调用不受尊重,则返回usage/help/error(随意调用(。

为此,我编写了以下解析部分:

usage(){
echo "you're wrong."
exit 1
}
[[ $# -lt 1 ]] && usage
options=$(getopt -o y,n,h,w: -l yes,no,help,working: -- "$@")
set -- $options
while true; do
case "$1" in
-h|--help|*) usage
shift;;
y|yes)
#do something
shift;;
n|no)
#..
shift;;
-w|-working|--working)
shift;;
--) #this is just syntax
shift
break;;
esac
done

但当我测试它时,它没有按预期工作*,你知道为什么/有一个样本来处理我的选择可能性吗?

*编辑:我总是触发使用显示

编辑2:删除"="正如@costapars3所指出的,谢谢,尽管仍然坚持使用usage((

以下是我发现的问题:

  1. 如果没有参数则退出
  2. 使用options=$(...设置选项(无空格(
  3. -h|--help|*)匹配所有内容,所以您有一个无限循环。您不需要在*上进行匹配,因为如果getopt发现一个无效参数,它将重新变为非零,而在-上的匹配通常会终止循环
  4. getopt对于无效参数返回非零,因此退出1,然后
  5. 使用-n|--no指定短选项和长选项
  6. --工作需要一个论据,但你只需要改变1
  7. -工作无效(使用getopt(。使用-w或-working

这里是更正的版本:

#!/bin/bash
usage() {
echo "you're wrong."
exit $1
}
[ $# -lt 1 ] && usage
options=$(getopt -o y,n,h,w: -l yes,no,help,working: -- "$@")
[ $? -ne 0 ] && usage 1
# default values
yes=
working=
set -- $options
while :
do
case "$1" in
-h|--help)
usage
;;
-y|--yes)
yes=1
shift
;;
-n|--no)
yes=0 # or no=1
shift
;;
-w|--working)
working=$2
shift 2
;;
--)
break
;;
esac
done

相关内容

  • 没有找到相关文章

最新更新