解析输入参数很困难

时间:2012-10-25 17:04:51

标签: linux bash shell

我的shell输入应遵循以下签名。

myscript.sh var1 var2 [-o var3] [-r var4]。

-o和-r是可选输入,这些选项可以在任何位置发生(在var1和var2之间或在开始/结束时),但如果指定了var3,则var3将始终位于var4之前。 var1也将在var 2之前。

#!/bin/bash

case "$#" in
([01]) echo "Usage: $0 var1 var2 [-o val3] [-r val4]" >&2; exit 1;;
esac

VAR1="$1"
VAR2="$2" 
VAR3=
VAR4=


while getopts ":o:r:" opt; do
  case $opt in
    o)
     VAR3=$OPTARG
      ;;
    r)
     VAR4=$OPTARG 
      ;;
    \?)
      echo "Invalid option: -$OPTARG" >&2
      exit 1
      ;;
    :)
      echo "Option -$OPTARG requires an argument." >&2
      exit 1
      ;;
  esac
done

shift $(( OPTIND - 1 ))


    if [ -z "${VAR3+xxx}" ] && [ -z "${VAR4+xxx}" ];
    then
    echo $1 $2;
    elif [ -z "${VAR3+xxx}" ]; 
    then
    echo $1 $2 $VAR4;
    elif [ -z "${VAR4+xxx}" ];
    then 
    echo $1 $2 $VAR3;
    else
    echo $1 $2 $VAR3 $VAR4;
    fi

如何处理可选参数inbetwen var1& VAR2

1 个答案:

答案 0 :(得分:2)

你的调用约定正在与'选项和参数优先'的经典调用约定作斗争。所以,你需要这样做:

case "$#" in
([01]) echo "Usage: $0 var1 var2 [-o val1] [-r val2]" >&2; exit 1;;
esac

VAR1="$1"
VAR2="$2"
shift 2

# Now use your getopts loop...