首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从源脚本扩展getopts

从源脚本扩展getopts
EN

Stack Overflow用户
提问于 2019-12-10 06:57:57
回答 1查看 38关注 0票数 0

我正在尝试扩展源代码脚本中的getopts,如下所示。如果传入a、b、c、d以外的选项,则需要打印"invalid option“并退出。

script_a.sh:

代码语言:javascript
复制
#!/bin/bash
script_a_getopts() {
   while getopts 'a:b:' OPT; do
      case "$OPT" in
         a)
           a=$OPTARG
           ;;
         b)
           b=$OPTARG
           ;;
         *)
           echo "invalid option"
           exit 1
           ;;
      esac
   done
}

script_b.sh

代码语言:javascript
复制
#!/bin/bash
source script_a.sh
while getopts ':c:d:' OPT; do
case "$OPT" in
c)
   c=$OPTARG
   ;;
d)
   d=$OPTARG
   ;;
 [?])
   script_a_getopts $@
esac
done


echo "a=$a"
echo "b=$b"
echo "c=$c"
echo "d=$d"

当我运行脚本时,它没有像预期的那样工作,显然我犯了一个错误。

代码语言:javascript
复制
$ ./script_b.sh -c cat -d dog -a apple -b boy
a=
b=
c=cat
d=dog

传递-x时未抛出错误。

代码语言:javascript
复制
$ ./script_b.sh -x
a=
b=
c=
d=
EN

回答 1

Stack Overflow用户

发布于 2019-12-10 11:47:19

简而言之:在调用script_a_getopts之前,您必须回滚OPTIND。

代码语言:javascript
复制
case "$OPT" in
c)
   c=$OPTARG
   ;;
 ...
 [?])
   let OPTIND--
   script_a_getopts $@
esac
done

长长的答案:

getopts跟踪使用OPTIND变量处理过的参数。当顶级getopts识别出未知项时,它已经通过将OPTIND移动到下一个参数来“消费”它。要让script_a_getopts处理该参数,需要回滚OPTIND以指向未处理的参数。

let OPTIND--将允许重新处理无法识别的参数。

附注:如果您希望允许以任意顺序(-c cat -a apple -d dog -b boy)放置选项,则必须在script_a_getopts中重复相同的操作。这将需要改进script_a_getopts函数中的错误处理。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59257856

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档