オプションのパラメータと非選択的なパラメータを正しくキャプチャする方法は?

オプションのパラメータと非選択的なパラメータを正しくキャプチャする方法は?

いくつかのパラメータといくつかのオプションを受け入れ、そのパラメータを印刷するシェルスクリプトを作成したいと思います。スクリプトの名前は次のとおりですabc.ksh。スクリプトの使用法は次のとおりです。
./abc.ksh -[a <arg>|b <arg>|c|d] <some_string>
次に、オプションと引数を使用するシェルスクリプトを作成します。

#!/bin/ksh

# Default Values
vara=","
varb=false
varbname=""
varc=false

# Scanning inputs
while getopts :a:b:cd option
do
        case $option in
                a) vara=$OPTARG;;
                   #shift $((OPTIND-1));;
                b) varb=true
                   varbname=$OPTARG;;
                   #shift $((OPTIND-1));;
                c) varc=true;;
                   #shift $((OPTIND-1));;
                d) echo "Usage $0 \-[a|b|c|d] <filename>"
                   exit 0;;
                \?) echo "Invalid option -$OPTARG. Please run '$0 -h' for help"
                    exit 1;;
                :) echo "Option -$OPTARG requires an argument. Please run '$0 -d' for help"
                   exit 1;;
esac
done

print "Args: $* \nvara: $vara \noptfile: $varb \nvarbname: $varbname \nvarc: $varc"

正しい入力の例:

  • ./abc.ksh -a "sample text" "some_string"
  • ./abc.ksh "some_string" -a "sample text"
  • ./abc.ksh -asample\ text some_string
  • など...

some_string私のスクリプトにキャプチャされた入力はありません。どうやってキャッチできますか?

ベストアンサー1

プログラムは通常、「some_string」部分を最後の引数に強制するため、これは.abc.ksh "some_string" -a "sample text"バグです。これにより、オプションの解析後も最後の引数(部分)のインデックスが保持されます$OPTIND"some_string"

これが許可されていない場合は、先頭でプレフィックス以外の引数をwhile確認できます(を入力する前に。これにより、"some_string"開始と終了の両方が提供されます。途中で必要な場合は使用しないか、またはをgetopts使用して実行できます。すべてgetopts最初のエラーが発生した場合は、プレフィックスのないパラメータが原因である可能性がありますgetopts

おすすめ記事