0

私のシェルへの入力は、次の署名に従う必要があります。

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

-o と -r はオプションの入力であり、これらのオプションは任意の場所 (var1 と var 2 の間、または開始/終了) で使用できますが、var 3 が指定されている場合、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

オプションの引数が var1 と var2 の間にある場合の処理​​方法

4

1 に答える 1

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...
于 2012-10-25T17:12:12.477 に答える