1

Bash でオプションを解析するために使用するスニペットを次に示します。

#!/bin/bash

PROGNAME=${0##*/}
PROGVERSION=0.1
wW='-4.5.5-double'
reName=

usage()
{
  cat << EO
Script purpose goes here.
EO

  cat <<EO | column -s\& -t

  -h, --help & show this output
  -r, --rename & renames confout to Your gro
  -v, --version & show version information
  -w, --workWith & gromax exec suffix
EO
}

SHORTOPTS="hvw:r"
LONGOPTS="help,version,workWith:rename"

ARGS=$(getopt -s bash --options $SHORTOPTS --longoptions $LONGOPTS --name $PROGNAME -- "$@")

eval set -- "$ARGS"

while true; do
    case $1 in
        -h|--help)
            usage; exit 0;;
        -v|--version)
            echo "$PROGVERSION"; exit 0;;
        -w|--workWith)
            wW=$2; shift;;
        -r|--rename)
            reName="true"; shift;;
        --)
            shift; break;;
        *)
            shift; break;;
    esac
    shift
done


# ====================
## finally the script:

echo "rename:" $reName
echo '    wW:' $wW

このスニペットは、トリガー (-r) の前にある場合にのみ、オプション (-w) を解析します。

~/wrk/mlDn/vas/res/bbst: test.bash -w 'dfdff' -r
rename: true
    wW: dfdff
~/wrk/mlDn/vas/res/bbst: test.bash -r -w 'dfdff' 
rename: true
    wW: -4.5.5-double

これはどのように修正できますか?私のスニペットの何が問題になっていますか?

4

2 に答える 2

2

shiftへの呼び出しを処理から削除します-r-wから を削除していARGSます。

于 2012-05-21T13:56:08.457 に答える
1

問題は、2 回シフトしていることです。1 回目はオプションが表示されたとき、2 回目はステートメント-rを終了したときです。caseこれにより、オプションを飛び越え-wます。したがって、シフトは 1 回だけにしてください。shiftステートメントの外側から を削除し、そのcase中ですべてのシフトを行います。

コードを次のように変更します。

while true; do
    case $1 in
        -h|--help)
            usage; exit 0;;
        -v|--version)
            echo "$PROGVERSION"; exit 0;;
        -w|--workWith)
            wW=$2; shift 2;; # shift twice here
        -r|--rename)
            reName="true"; shift;;
        --)
            shift; break;;
        *)
            shift; break;;
    esac
    #shift # this shift is not required
done
echo  "rename:" $reName
echo '    wW:' $wW
于 2012-05-21T13:57:27.620 に答える