シェルスクリプトは-a -bのようなオプションを処理しますが、--abc?を保持しますか?

シェルスクリプトは-a -bのようなオプションを処理しますが、--abc?を保持しますか?

そのため、いくつかの準備作業を実行してからユーティリティを実行するシェルスクリプトがあります。

-a準備はスイッチの影響を受けたり、スイッチを待つことができます-n。これらのスイッチ以外のコマンドラインの内容はユーティリティに渡されます。現在私のスクリプトは次のとおりです

while getopts ":an" opt; do
  case $opt in
    a)
      #something
      ;;
    n)
      #something else
      ;;
    \?)
      echo "Invalid option: -$OPTARG" >&2
      ;;
  esac
done
shift $((OPTIND-1))
  #more prep
my_utility $@

--abcただし、解釈されたgetoptsabオプションなどの長い形式オプションをユーティリティに渡そうとすると失敗します。c

-aそれでは、オプションの1つが-n処理されますが、--abc変更されない方法でオプションを処理するにはどうすればよいですか?もちろん、シェルをダンプしてPythonで実行しない限り、オプションは非常に簡単ですが、ファイルをコピーしてユーティリティを実行する必要があります。

ベストアンサー1

二重ダッシュコマンドを解釈するために組み込まれていgetoptますgetopts

組み込みのbashを使用して長いオプションをエミュレートする方法がありますが、パッチワークなので、getoptsそれをしてはgetoptsいけません。実装する長い形式。

したがって、スクリプトは次のようになります。

#!/bin/bash

# Get options
OPTS=`getopt --options an: --long a_something,n_something_else: -n 'parse-options' -- "$@"`

if [ $? != 0 ] ; then echo "Failed parsing options." >&2 ; exit 1 ; fi

#echo parsed and cleaned up options
echo "$OPTS"
eval set -- "$OPTS"

bSomething=false
bSomethingElse=false

# "Endless" loop over the parsed options
while true; do
  case "$1" in
    -a | --a_something )       bSomething=true;     shift ;;
    -n | --n_something_else )  bSomethingElse=true; shift ;;
    -- )                                            shift; break ;;
    * )                                                    break ;;
  esac
done

より多くの情報を知りたい場合:man getopt
詳細は:man getopt(3)

おすすめ記事