1

Bash関数でこのオプション解析コードをクリーンアップするにはどうすればよいですか? 印刷用に単純な「-h」フラグが必要な多くの関数にコピーアンドペーストされます。むしろ、論理的に同等の汎用ルーチンが必要です

local prefix_opt1
local prefix_opt2
....
__handle_opts "usage message" "additional getopts flags" "prefix"

例えば:

local foo_k
local foo_v
__handle_opts "Usage: ${FUNCNAME[0]}" [-k key -v version] widget\nBuild a widget using the key and version." "k:v:" "foo_"

if [[ -z $foo_k ]] ; then
    foo_k="default value"
fi
.....

関数は、自分の dot-bashrc ファイルで「ソース化」されます。

コードは次のようになります (注: 一部の関数はフラグを介してオプションを取ります)。

function kitten_pet {

  local usage="Usage: ${FUNCNAME[0]} [-h] <kitten>\nPet the kitten."

  ################################################
  local help=0
  local error=0
  local OPTIND
  local opt
  while getopts ":h" opt "$@"
  do
    case $opt in

      h)
        echo -e "$usage"
        help=1
        break
        ;;

      \?)
        echo "Invalid option: -$OPTARG"
        error=1
        break
        ;;
    esac
  done
  if [ $error -gt 0 ] || [ $help -gt 0 ] ; then
    return 1
  fi
  shift $((OPTIND-1))
  ################################################

  if [ $# -lt 1 ]
  then
    echo -e "$usage"
    return 1
  fi

  __kitten_pet "$1"
}

通常は、node-commander や node-optimist などを使用して、スクリプト作成のニーズに合わせて JavaScript (またはおそらく Python) でスクリプトを記述しますが、今回は Bash を機能させようとしています。しかし、バッシュは私をバッシングしています。

4

1 に答える 1

0

汎用オプション パーサーに、呼び出し元のスクリプトが管理するオプションのリストを渡します。

呼び出しスクリプトで管理されるオプションごとに、 という関数を作成しますoption_X_parser。これらのオプション パーサー関数は、オプションの引数 ($OPTARG) を受け入れ、0 (成功) または 1 (エラー) を返す必要があります。

ジェネリック オプション パーサーは、ジェネリック オプション ("h"、"n"、"v" など) と、呼び出しプログラムから提供されたオプションを使用して、シェルの case ステートメントを作成する必要があります。関連付けられたオプション パーサー関数を持つオプションの場合、case ステートメントにオプション パーサーの呼び出しを含める必要があります。

構成されたオプションごとに case ステートメントが必要です。これは、定義されている場合はユーザー提供の関数を呼び出すか、グローバル変数を設定することで一般的に管理する必要があります (たとえば、opt_XX特定のオプションです)。

例えば:

__handle_options "$usage", 'hni:v'

option_h_parser() { echo "$usage"; exit 1 ; } option_n_parser() { norun=1 ; return 0 ; } option_v_parser() { verbose=1 ; return 0 ; } option_i_parser() { insert_at="$1" ; return 0 ; } # invoke with argument

基本的に、オプション文字に基づいて、暗黙の関数名を使用します。

各オプション パーサーの戻り値は、汎用オプション ハンドラー関数によって調べられます。このようなもの:

function_name="option_${opt}_parser"
if eval "$function_name $OPTARG" ; then
  # option is good
else
  error "'$opt' parser failed."
  exit 2
fi

于 2014-01-08T08:42:47.167 に答える