9

Googleはついに私を失望させました。Bourne シェル スクリプトでこれを行う方法が見つからないようです。

プロジェクトのすべてのテストを処理するシェル スクリプトを作成しています。このスクリプトが実行できる各タスク (ビルド、実行、クリーンなど) の関数を設定し、追加のコマンド ライン パラメーター (コマンド自体以外) を目的の関数に渡したいと考えています。

例:

./test.sh build -j関数に渡す必要が-jありbuildます。

このロジックの疑似コード バージョンは次のようになります。

function build() {
   make $*
}

if [ $1 == 'build' ]; then
   build $2 -> $N
fi

どうすればこれを達成できますか?

4

3 に答える 3

16

コマンドを使用してこの効果を実現できると思いますshift。すべての位置パラメータを 1 つ下に移動し、 の値を削除します$1(したがって、 の値は$3に移動し$2、 の値は$2に移動し$1、 の値$1は失われます)。それが完了したら$@、実際に興味のある引数のリストを取得するために使用できます。

function build() {
    echo "build with $@"
}

echo "Starting args are $@"
cmd=$1
shift

if [ "$cmd" = 'build' ]; then
    build "$@"
fi
于 2012-08-17T09:33:13.407 に答える
5
function build() {
   make "$@"
}

if [ "$1" == 'build' ]
then shift        # Lose $1
     build "$@"   # Pass what was $2 .. $N
fi

"$@"関数自体と関数の呼び出しの両方で を使用していることに注意してください。二重引用符または;を使用せずに$*またはを使用することはほとんど正しくないと主張します。元の引数リストの間隔のみを保持します。これは、スペースを含む引数がある場合に重要です。引数をエコーする場合は、合理的です。それ以外の場合は、90% 以上の確率で を使用した方がよいでしょう。また、私はテスト オペレーターでの引用に対して非常に保守的な態度をとっています。引用符の省略には注意してください。$@"$*""$@"echo "The arguments: $*""$@""$1"

以下も参照してください。

于 2012-08-17T09:33:23.447 に答える
2

より詳細なエラー メッセージを出力したい場合を除き、$1明示的にテストする必要はありません。ただ行う:

#!/bin/sh -e
function build() {
   make "$@"
}

"$@"

有効な関数$1を指定すると、必要に応じて呼び出されます。そうでない場合は、シェルによっては、おそらくそれほど悪くないエラー メッセージが表示されます。

于 2012-08-17T21:11:01.413 に答える