Bash解释了一个选项太长的论点

时间:2014-05-04 10:55:44

标签: bash arguments options variadic-functions

我正在写一个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"。 我该如何解决这个问题?

2 个答案:

答案 0 :(得分:3)

由于未键入命令行参数,因此无法告诉bash -p的参数必须是整数,因此bash无法推断出解析-cp15m12的正确方法是-c -p15 -m12而不是-c -p15m12。由于-c 不能使用参数而getopts无法定义多字符选项,bash 可以推断出{{1} }被分为两个单独的选项,-cp15-c

答案 1 :(得分:0)

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上为我工作。)