getopts - 次の$OPTARGをパラメータとして読み取るのを防ぐ方法は?

getopts - 次の$OPTARGをパラメータとして読み取るのを防ぐ方法は?

私はgetoptsを使い始めましたが、問題が見つかりました。

たとえば、次のスクリプトがあります。

while getopts "h:loav" opt; do
case $opt in
h)
  h=$OPTARG
  echo $h
  ;;

しかし、実行してみると:

$ ./ftpclean.sh -h -l
-l

2番目のオプションを最初のオプションの引数として渡します。したがって、ユーザーが引数の設定を忘れた場合:

$ ./ftpclean.sh -h argument
argument

getopts設定しますecho *second option*...

これを避けるための「法的」方法はありますか?

私が見つけた最良の解決策は、次の機能を追加することです。

function checkargs () {
if [[ $OPTARG =~ ^-[a/l/o/a/v]$ ]]
  then
  echo "OPTERR"
  exit 1
fi
}

変数を設定する前に実行してください。

 while getopts "h:loav" opt; do
  case $opt in
h)
  checkargs
  h=$OPTARG
  echo $h
  ;;

だから今:

$ ./ftpclean.sh -h -l
OPTERR

答え1

getopts h:このオプションに-h引数が必要であることを示します。オプションの引数はオプション自体と同じ単語にあり、次の単語に何もない場合でも可能です。空の引数を指定する唯一の方法は、オプションの後にヌルワードを渡すことです。

./ftpclean.sh -h -lと書くと-lオプションのパラメータです-h。を書くこともできます./ftpclean.sh -h-l。空のパラメータをに渡すには、-hを作成します./ftpclean.sh -h '' -l

Unixの引数規則に違反し、引数がコマンドと同じ単語になるように要求したいようです。この作業を実行する場合(ユーザーを混乱させ、無言の非標準的な作業を実行することを呪いにすることができるため、強くお勧めしません)、getoptsあまり役に立ちません。自分で分析することをお勧めします。

関連情報