2

テストスイートをパラメーターとして渡すことができるスクリプトがあります:

$ bash-specs a.suite b.suite

ユーザーがテスト スイートを提供しない場合、現在のフォルダー内のすべてのテスト スイートが実行されます。これは私が現在これを行う方法です:

local suites

if (($# > 0)); then
  suites=$@
else
  suites=*.suite
fi

これは問題ない解決策ですが、もっとエレガントな方法があると感じています。私は基本的に、パラメータが指定されていない場合に条件付きの割り当てを行うか、デフォルト値を設定する方法を探しています。

4

2 に答える 2

5

私はこれをします:

if (( ! $# )); then
    set -- *.suite
fi

これで、ユーザーがファイル名を指定したか、デフォルトのままにしたかに関係なく、$1、$2 などにファイル名が格納されます。

いくつかのメモ:

あなたの割り当てsuitesは、何の役にも立たないようです。これは配列ではないため、スペースで区切られたファイル名を持つ文字列、または展開されていない glob のいずれかを取得します"*.suites"。ファイル名にスペースや奇妙evalな文字が含まれていると、問題が発生します。引数をループして個別に処理するか、実際の配列を使用することをお勧めします。

上記のスニペットのようなものを使用すると"$@"、個別に引用されているかのように適切に区切られたすべての引数に展開されます。引数をいじる場合は、次のように元の引数を配列変数に保存できます。

suites=( "$@" )

そして、全体を(ここでも、適切に分離して)取得します"${suites[@]}"

于 2012-07-14T16:00:58.743 に答える
2

注:この回答を使用する前に、その欠点と実際にどのように拡張されるかについてのコメントを読んでください。

短くて甘い:

local suites=${@:-*.suite}

(中途半端なしゃれ)

${var:-default}構文の詳細については、 bashman ページの「パラメーター展開」を参照してください。このセクション全体を読む価値があります。

編集: マークが指摘するように、ファイル名にスペースが含まれていた場合、文字列値suitesはあまり役に立ちません (区切りスペースと名前内スペースの区別が失われます)。私は彼の答えに行きます。(また、パターンは引用符内で展開されないため、これを編集して引用符を削除しました。)

(私はこの回答を削除するだけで約1編集しています:)

于 2012-07-14T15:43:28.193 に答える