オプションの終わりを処理する方法 - getoptsから

オプションの終わりを処理する方法 - getoptsから

私はbashスクリプトのパラメータを解析するためにgetoptsを使います。

while getopts ":hd:" opt; do
  case $opt in
    d ) echo "directory = $OPTARG"; mydir="$OPTARG"; shift $((OPTIND-1)); OPTIND=1 ;;
    h ) helptext
      graceful_exit ;;
    * ) usage
      clean_up
      exit 1
  esac
done

exeparams="$*"

exeparams未解決のオプション/引数はすべて保存されます。 exeparamsを使用してスクリプト内で実行されるコマンドのオプション(スクリプト自体のオプションと重複する可能性があります)を保存したいので、--を使用してスクリプトに渡されたオプションを終了したいと思います。たとえば、渡すと

myscript -d myscriptparam -- -d internalparam

exeparams開催されます

-- -d internalparam

--これで、これらのパラメータを内部コマンドに渡すために先行部分を削除したいと思います。これを行うエレガントな方法はありますか?それとも、--getoptsから取得せずに残りのみを含む文字列を取得できますか?

ベストアンサー1

組み込みshiftgetoptsループが完了すると、

shift "$((OPTIND - 1))"

処理されたすべてのオプションが削除されます。

ここで、--スクリプトの最初の部分(以前)の非オプション引数(存在する場合)の処理を完了する必要があります。いったん向き合うと、--後部(-d internalparam後部--)だけが残るまで外に引き出します。一方向(bash構文を使用):

while [[ $# -gt 0 ]]; do
    # process next argument
    case $1 in
    foo) # process foo
    ;;
    --) shift; break;; # found '--', discard it and exit loop
    *) # handle unrecognized argument
    ;;
    esac
    # not '--', so discard the argument and continue
    shift
done

最後に、渡すことができる2番目のオプション/パラメータセットのみが残ります。するいいえ$*残りのパラメータを他のコマンドに渡すために使用されます。置換を使用すると、"$@"元の単語分割が維持されます。

external_command "$@"

おすすめ記事