【问题标题】:getopts not working - bashgetopts 不工作 - bash
【发布时间】:2011-12-19 11:53:29
【问题描述】:

我正在编写一个接受参数的 bash 脚本。我正在使用 getopts 来实现它。

#!/bin/bash

while getopts ":a" opt; do
  case $opt in
    a)
      echo "-a was triggered!" >&2
      ;;
    \?)
      echo "Invalid option: -$OPTARG" >&2
      ;;
  esac
done

但上面的代码返回给我这个错误。

'etOpts_test.sh: line 4: syntax error near unexpected token `in
'etOpts_test.sh: line 4: `  case $opt in

我正在使用 CentOs 5.5

【问题讨论】:

    标签: linux bash shell getopts


    【解决方案1】:

    在第 4 行,您可能需要 case "$opt" in(引用 $opt)。否则,如果它包含元字符,它可能会失败。

    【讨论】:

      【解决方案2】:

      它应该是 a:,而不是 :a 来表示需要参数的标志,并且问号也不应该被引用,因为它用作通配符。整体代码将是(还展示了一个标志 -h 不带参数):

      function usage {
        echo "usage: ..."
      }
      
      a_arg=
      while getopts a:h opt; do
        case $opt in
          a)
            a_arg=$OPTARG
            ;;
          h)
            usage && exit 0
            ;;
          ?)
            usage && exit 2
            ;;
        esac
      done
      

      【讨论】:

      • 我相信你是对的。但是:一个工作我不知道为什么。我刚刚清理了脚本主体,它现在可以工作了。
      • 当心!这个答案引入了对 OP 代码的重大更改: -- :a vs a: - 当用作 optspec 时,第一种形式指示 getopts 使用静默错误报告并期望选项 a 具有 no 参数,而第二种形式的意思是:使用详细错误报告并期望选项a 有参数; -- \?) vs ?) - 当静默错误报告开启时,第一种形式将仅匹配 getopts 遇到的无效选项,而第二种形式将匹配无效选项、缺少参数的选项和未实现的有效选项声明。