【问题标题】:How does the OPTIND variable work in the shell builtin getoptsOPTIND 变量如何在 shell 内置 getopts 中工作
【发布时间】:2012-12-24 08:50:56
【问题描述】:

我的shell脚本很简单,如下:

  while getopts "abc:" flag; do
         echo "$flag" $OPTIND $OPTARG
  done

我做了如下一些测试:

Blank@Blank-PC:~/lab/shell/getopts_go$ sh foo.sh -abc CCC Blank
a 1
b 1
c 3 CCC

Blank@Blank-PC:~/lab/shell/getopts_go$ sh foo.sh -a -b -c CCC Blank
a 2
b 3
c 5 CCC

Blank@Blank-PC:~/lab/shell/getopts_go$ sh foo.sh -ab -c CCC Blank
a 1
b 2
c 4 CCC

Blank@Blank-PC:~/lab/shell/getopts_go$ sh foo.sh -a -bc CCC Blank
a 2
b 2
c 4 CCC

我无法理解 OPTIND 如何与不同的命令行调用一起工作,我对输出感到困惑。

你能帮忙弄清楚OPTIND的计算机制吗?

【问题讨论】:

  • 理解OPTIND的优秀测试脚本

标签: bash shell getopts


【解决方案1】:

根据man getoptsOPTIND是下一个要处理的参数的索引(起始索引为1)。因此,

sh foo.sh -abc CCC Blank 中,arg1 是-abc,所以在a 之后,当下一个是b (a 1) 时,我们仍在解析arg1。当 next 是 c 时也是如此,我们仍然在 arg1 (b 1) 中。当我们在c 时,由于c 需要一个参数(CCC),所以OPTIND3(arg2 是CCC,我们跳过它)。

sh foo.sh -a -b -c CCC Blank 中,arg1 是a,arg2 是b,arg3 是c,arg4 是CCC。所以我们得到a 2, b 3, c 5

sh foo.sh -ab -c CCC Blank 中,参数是(1:-ab、2:-c、3:CCC 和 4:Blank)。所以我们得到:a 1, b 2, c 4

sh foo.sh -a -bc CCC Blank 中,args 是(1:-a,2:-bc,3:CCC,4:Blank),我们得到a 2, b 2, c 4

【讨论】:

  • 真的很感谢你的解释,这让我很困扰。原来是我对下一个参数的含义感到困惑。
猜你喜欢
  • 1970-01-01
  • 2018-03-30
  • 1970-01-01
  • 2017-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-27
  • 2018-01-01
相关资源
最近更新 更多