【问题标题】:Bash interprets too long arguments for an optionBash 解释选项的参数太长
【发布时间】:2014-05-04 10:55:43
【问题描述】:

我正在编写一个 bash 脚本,它可以采用三个选项:c、p 和 m; c 不能有参数,但 p 和 m 必须有参数。在我的脚本中,我有这些代码行:

while getopts ":cp:m:" opt
do
   case $opt in
      c  ) capitals=1
           ;;
      m  ) length=$OPTARG
           ;;
      p  ) number=$OPTARG
           ;;
      \? ) echo "ERROR" 1>&2
           exit 1
           ;;
   esac
done
shift `expr $OPTIND - 1`

现在,当我在命令行中编写时

myScript.sh -c -p 15 -m 12

一切都很完美。但是当我写的时候

myScript.sh -cp15m12

出错了。 Bash 将选项'p' 的参数解释为"15m12",而它应该只是"15"。 我该如何解决这个问题?

【问题讨论】:

  • 但是你为什么要从命令行剥离间隔?
  • p 选项绝对无法判断字符串的m12 部分是与p 选项一起使用还是单独的选项。除非您编写自己的选项解析器来分隔数字和字母等的参数,否则对于具有这些选项的任何命令都是如此。
  • 使用shift $(($OPTIND - 1)) 可能比使用expr 更好。

标签: bash arguments options variadic-functions


【解决方案1】:

由于没有键入命令行参数,因此无法告诉 bash -p 的参数必须是整数,因此 bash 无法推断出解析 @ 的正确方法987654324@ 是 -c -p15 -m12 而不是 -c -p15m12。由于-c 没有 接受参数并且getopts 不能定义多字符选项,bash 可以 推断-cp15 分为两个单独的选项, -c-p

【讨论】:

    【解决方案2】:

    getopts 的值相当有限——编写自己的支持选项集群的替换并不难。这是一个快速的临时尝试。

    #!/bin/sh
    
    while true; do
        case $1 in
         -*) opt=${1#-}; shift;;
         *) break;;
        esac
        while [ "$opt" ]; do
            case $opt in
              '-') opt=""; break 2;; 
              c*)  capitals=1; opt=${opt#c};;
              m[0-9]*)
                opt=${opt#m}; length=${opt%%[!0-9]*}; opt=${opt#$length};;
              m) opt=""; length=$1; shift;;
              p[0-9]*)
                opt=${opt#p}; number=${opt%%[!0-9]*}; opt=${opt#$number};;
              p) opt=""; number=$1; shift;;
          h|\?) echo "Syntax: $0 [-c] [-m length] [-p number]" >&2; exit 1;;
              *) echo "Invalid option '$opt'" >&2; exit 2;;
            esac
        done
    done
    
    cat <<HERE
    capitals: '$capitals'
    length: '$length'
    number: '$number'
    args: '$@'
    HERE
    

    (不确定break 2 是否与股票sh 完全兼容。在dash 上为我工作。)

    【讨论】:

      猜你喜欢
      • 2015-04-30
      • 2021-03-28
      • 1970-01-01
      • 2013-11-03
      • 2021-04-29
      • 2020-05-08
      • 1970-01-01
      • 2019-03-25
      • 1970-01-01
      相关资源
      最近更新 更多