混合パラメータをスクリプトに渡し、オプションのパラメータのみを渡す方法

混合パラメータをスクリプトに渡し、オプションのパラメータのみを渡す方法

私はこの問題を私がしなければならないよりも長い間調査してきましたが、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

おすすめ記事