いくつかのパラメータといくつかのオプションを受け入れ、そのパラメータを印刷するシェルスクリプトを作成したいと思います。スクリプトの名前は次のとおりです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
。
答え2
選択項目をキャプチャした後
shift $OPTIND
if [ $# -eq 1 ]; then
some_str="$1"
else
echo "Error: missing argument" >&2
fi