具有`getopts`的Bash函数仅在第一次运行时有效

暗话者

f根据此处的示例(在“带参数的选项”下)在Bash中定义了该函数

f () {
  while getopts ":a:" opt; do
    case $opt in
      a)
        echo "-a was triggered, Parameter: $OPTARG" >&2
        ;;
      \?)
        echo "Invalid option: -$OPTARG" >&2
        return 1
        ;;
      :)
        echo "Option -$OPTARG requires an argument." >&2
        return 1
        ;;
    esac
  done
}

尽管他们使用脚本,但我直接在shell中定义了函数。

当我第一次启动Bash并定义函数时,一切正常:f -a 123prints -a was triggered, Parameter: 123但是,当我第二次运行完全相同的行时,什么也没打印

是什么原因导致这种现象?它发生在Bash 3.2和4.3中,但是在Zsh 5.1中可以正常工作。这是令人惊讶的,因为该示例原本是针对Bash,而不是Zsh。

cuonglm

bash getopts使用环境变量OPTIND来跟踪处理的最后一个选项参数。OPTIND每次getopts在同一个shell会话中调用时,只有在调用shell时并不会自动重置这一事实因此,从第二次您getopts在同一会话中使用相同的参数进行调用以来OPTINDgetopts没有改变,认为它已经完成了工作,却什么也没做。

您可以OPTIND手动重置以使其起作用:

$ OPTIND=1
$ f -a 123
-a was triggered, Parameter: 123

或者只是将函数放入脚本中并多次调用该脚本。


zsh getopts稍有不同。OPTIND通常在每次退出Shell函数时都会重置为1。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

正常运行时,第一次点击chrome.runtime.sendMessage无效。它虽然在调试时有效

来自分类Dev

twitter小部件仅在第一次加载时有效,然后失败

来自分类Dev

Javascript:JSON请求仅在第一次使用时有效

来自分类Dev

jQuery验证-errorPlacement仅在第一次使用时有效

来自分类Dev

文档生成仅在第一次时有效

来自分类Dev

Javascript:JSON请求仅在第一次使用时有效

来自分类Dev

对象搜索仅在第一次时有效

来自分类Dev

切换仅在第一次时有效

来自分类Dev

getElementById 仅在第一次有效

来自分类Dev

我的剑道级联下拉列表失败了。仅在第一次使用时有效

来自分类Dev

jQuery Mobile listview详细信息页面数据跟踪仅在第一次时有效

来自分类Dev

Intent Intents.Insert.ACTION仅在第一次使用时有效?

来自分类Dev

jQuery Mobile listview详细信息页面数据跟踪仅在第一次时有效

来自分类Dev

存储过程中的临时视图仅在第一次更新时有效

来自分类Dev

为什么按 Id 对对象列表进行分组仅在第一次调用该函数时有效?

来自分类Dev

jQuery仅在第一次时有效,但在第二次在ng-repeat中循环时无效

来自分类Dev

重新加载页面后,Gif无法正常工作。仅在第一次打开窗口时有效

来自分类Dev

调用使用观察功能在选择框中显示子类别列表的功能仅在第一次时有效

来自分类Dev

使用自定义过滤器按钮过滤列表,仅在第一次单击时有效,但随后的点击效果不佳!特效

来自分类Dev

Office 365应用和Angular 2路由仅在第一次使用时有效

来自分类Dev

Xaml C#绑定数据仅在第一次有效

来自分类Dev

jQuery | 点击操作仅在第一次有效

来自分类Dev

从mysql获取的jQuery仅在第一次有效

来自分类Dev

jQuery ajax发布仅在第一次有效

来自分类Dev

用户权限检查仅在安装后第一次有效

来自分类Dev

NULL索引表键值错误仅在语句的第一次运行时引发

来自分类Dev

Realm对象在写入之前被“无效”,仅在第一次运行时

来自分类Dev

NULL索引表键值错误仅在语句的第一次运行时引发

来自分类Dev

UITableView仅在第一次运行时以正确的顺序显示行

Related 相关文章

  1. 1

    正常运行时,第一次点击chrome.runtime.sendMessage无效。它虽然在调试时有效

  2. 2

    twitter小部件仅在第一次加载时有效,然后失败

  3. 3

    Javascript:JSON请求仅在第一次使用时有效

  4. 4

    jQuery验证-errorPlacement仅在第一次使用时有效

  5. 5

    文档生成仅在第一次时有效

  6. 6

    Javascript:JSON请求仅在第一次使用时有效

  7. 7

    对象搜索仅在第一次时有效

  8. 8

    切换仅在第一次时有效

  9. 9

    getElementById 仅在第一次有效

  10. 10

    我的剑道级联下拉列表失败了。仅在第一次使用时有效

  11. 11

    jQuery Mobile listview详细信息页面数据跟踪仅在第一次时有效

  12. 12

    Intent Intents.Insert.ACTION仅在第一次使用时有效?

  13. 13

    jQuery Mobile listview详细信息页面数据跟踪仅在第一次时有效

  14. 14

    存储过程中的临时视图仅在第一次更新时有效

  15. 15

    为什么按 Id 对对象列表进行分组仅在第一次调用该函数时有效?

  16. 16

    jQuery仅在第一次时有效,但在第二次在ng-repeat中循环时无效

  17. 17

    重新加载页面后,Gif无法正常工作。仅在第一次打开窗口时有效

  18. 18

    调用使用观察功能在选择框中显示子类别列表的功能仅在第一次时有效

  19. 19

    使用自定义过滤器按钮过滤列表,仅在第一次单击时有效,但随后的点击效果不佳!特效

  20. 20

    Office 365应用和Angular 2路由仅在第一次使用时有效

  21. 21

    Xaml C#绑定数据仅在第一次有效

  22. 22

    jQuery | 点击操作仅在第一次有效

  23. 23

    从mysql获取的jQuery仅在第一次有效

  24. 24

    jQuery ajax发布仅在第一次有效

  25. 25

    用户权限检查仅在安装后第一次有效

  26. 26

    NULL索引表键值错误仅在语句的第一次运行时引发

  27. 27

    Realm对象在写入之前被“无效”,仅在第一次运行时

  28. 28

    NULL索引表键值错误仅在语句的第一次运行时引发

  29. 29

    UITableView仅在第一次运行时以正确的顺序显示行

热门标签

归档