【问题标题】:bash getopts not recognizing the second argumentbash getopts 无法识别第二个参数
【发布时间】:2016-03-10 03:34:45
【问题描述】:

这是我最简单形式的整个脚本。

#!/bin/bash
src=""
targ=${PWD}

while getopts "s:t:" opt; do
  case $opt in
    s)
      src=$OPTARG
      ;;
    t)
      targ=$OPTARG
      ;;
  esac
  shift $((OPTIND-1))
done

echo "Source: $src"
echo "Target: $targ"

我以getopts_test -s a -t b 运行此脚本

但是,它总是在Target: 前面打印pwd 而从不打印b

我在这里错过了什么?

【问题讨论】:

  • 尝试将shift 移出while 循环:将其移至done 之后
  • 当您在循环内进行移位时,您会从参数列表中删除 -sa 参数,但 getopts 仍然认为它处理了参数 1 和 2(现在包含 @ 987654332@ 和 b),所以它看起来超越了它们,并说“无事可做”。
  • 知道了。感谢您的详细解释

标签: bash getopts


【解决方案1】:

b 从未打印的原因是循环中的shift 在第一次迭代后将处理的选项移开,即在打印a 之后。使用shift $((OPTIND-1)) 旨在访问可能的给定可变参数。自然,一旦您删除了shifttarg 将重新分配给b,并且${PWD} 不再包含在其中,因为您没有字符串的连接(targ-t 的选项) 任何地方。

【讨论】:

    【解决方案2】:

    @glenn-jackman 在评论中建议的替代方案 会是这样的:

    #!/bin/bash
    src=""
    targ=${PWD}
    
    while getopts "s:t:" opt; do
      case $opt in
        s)
          src=$OPTARG
          echo "Source: $src"
          ;;
        t)
          targ=$OPTARG
          echo "Target: $targ"
          ;;
      esac
    
    done
    
    shift $((OPTIND-1)) # Turning to non-option arguments say a file name and so on.
    

    您可以在没有shifting 的情况下使用自然的论点。

    【讨论】:

    • 循环后需要移位,以便您可以删除选项参数(和--)并仅保留非选项参数"$@"
    • @JonathanLeffler :感谢您提醒非选项参数。编辑了答案。 :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-04
    • 2022-11-22
    • 1970-01-01
    相关资源
    最近更新 更多