私はこの問題を私がしなければならないよりも長い間調査してきましたが、getoptsが非常に混乱しているツールであることがわかりました。
私がしたいことは次のとおりです。 $1 $2 $3 のような引数を渡すことができるスクリプトがあり、そのうちの1つはオプションです -e email
私がしたことは次のとおりです。もちろんまったく動作しませんでした。
#!/bin/bash
if [[ $# -lt 2 ]] || [[ $# -gt 3 ]]
then
echo
echo "usage is `basename $0` argument1 argument2 {-e email}"
exit 1
fi
while getopts e: flag; do
case $flag in
e)
EMAIL=$OPTARG;
;;
?)
exit;
;;
esac
done
[[ -v $EMAIL ]] && echo "I am sending you $1 and $2!!" | mutt -s "present" $EMAIL && exit 0
echo "I am keeping $1 and $2 to myself"
もちろん、このgetoptsビジネスを無視して使用することはできません。ちょうど正しく使用する方法を学びたいだけです。
ベストアンサー1
いくつかの質問があります:
- オプションを処理する前にパラメーター数をテストしています。オプションを処理するまで、argvのスロット数をオプションが占めているかどうかは
$#
わかりません。オプションの存在を予測しても、それが(argvスロットを1つ消費する)か(2スロットを消費する)かは-e
わかりません。オプションではなく引数2つを正確に受けたいと思うので、すべきことは正確に2つと同じであることを確認することです。-eemail
-e email
$#
後ろにオプションが消費されました。 [[ -v $EMAIL ]]
電子メールは何の意味もありません。これにより、次のようなテストが行われます。値of は、$EMAIL
望ましくない有効なシェル変数を指定します。これがまさにあなたの意味です[ -n "$EMAIL" ]
getopts
オプションは使用されず、解析のみです。解析したら、を使用してスキップする必要がありますshift $(($OPTIND-1))
。- スクリプトを誤って呼び出しました。オプションはパラメータの前にあるので使用法はです
$0 [-e email] argument1 argument2
。