使用getopt解析长参数会跳过第一个值

时间:2016-04-20 11:19:12

标签: bash getopt

我正在尝试使用getopt来解析长参数(其中一些是强制性的,另一些则不是)。代码:

#!/bin/bash

# firstName is compulsory, age is not and lastName is again compulsory.

OPTS=`getopt --long firstName:,age::,lastName: -n 'longArgumentsParsing' -- "$@"`

if [ $? != 0 ] ; then echo "Failed parsing options." >&2 ; exit 1 ; fi

#echo "$OPTS"
eval set -- "$OPTS"

while true; do
  echo "Argument seen: $1";
  echo "And value seen: $2";
  case "$1" in

    --firstName ) echo "First name: $2"; shift 2;
        ;;

    --lastName )
        echo "Last Name: $2";
        shift 2;
        ;;

    --age ) if [ -z "$2" ];
            then
              echo "Age is not specified.";
            else
              echo "Age specifed: $2"; shift 2;
            fi
            ;;

    -- ) shift; break ;;

    * ) break ;;
  esac
done

每次使用./longArgumentsParsing --firstName sriram --age 30运行时,程序都会退出并输出以下内容:

Argument seen: sriram
And value seen: --lastName  

程序显然无法正确解析输入键和参数值对。为什么?我哪里错了?

更新:

根据this answer,我尝试自己调试: 在命令行上:
set -- --firstName sriram --lastName shankar 然后:
OPTS=$(getopt -l firstName:,lastName: -- "$@");
获得输出:
echo $?; echo "$OPTS"
0 'sriram' --lastName 'shankar' --

我的问题:
1.我怎样才能使上述内容正确?
2.我删除了可选参数(我不想这样做),但仍然出现错误。

1 个答案:

答案 0 :(得分:0)

上述代码中存在两个问题:

  1. 脚本只解析长参数。如果只使用长参数,则getopt的正确调用如下:
  2.   

    OPTS = $(getopt -o'' - l“firstName:,lastName:,age ::” - “$ @”);

    请注意''标志旁边的-o。 Getopt要求-o标志留空,以防没有短格式参数。

    1. 需要使用=符号指定此脚本的参数 脚本的示例调用将是:
      ./longArgumentsParsing.bash --firstName=sriram --lastName=shankar --age=30