0

私は現在、テストスイートを実行するためのbashスクリプトを書いています。スイートをこのスクリプトに直接渡す以外に、

./bash-specs test.suite

また、スイートが渡されない場合は、特定のディレクトリ内のすべてのスクリプトを実行できる必要があります。

./bash-specs # executes all tests in the directory, namely test.suite

これはこのように実装されます

(($# == 0)) && set -- *.suite

したがって、スイートが渡されない場合、.suiteで終わるすべてのファイルが実行されます。これは正常に機能しますが、ディレクトリにそのようなファイルが含まれていない場合は失敗します。

つまり、その末尾のファイルが実際にあるかどうかをテストするためのチェックも必要になります。これをbashでどのように行うのですか?

私は次のようなテストを考えました

[[ -f *.suite ]]

動作するはずですが、ディレクトリに複数のファイルがある場合は失敗するようです。

4

4 に答える 4

5

-f失敗する理由は-f、単一のパラメーターのみを受け取るためです。すると、次のよう[[ -f *.suite ]]に展開されます。

[[ -f test.suite test2.suite test3.suite ]]

...これは無効です。

代わりに、これを行います。

shopt -s nullglob
FILES=`echo *.suite`
if [[ -z $FILES ]]; then 
    echo "No suites found"
    exit
fi

for i in $FILES; do
    # Run your test on file $i
done

nullglobは、ワイルドカードパターン自体に拡張するのではなく、見つからないワイルドカードパターンをゼロに拡張するシェルオプションです。$FILESファイルのリストまたは何も設定されていない場合は-z、空をテストし、適切なエラーメッセージを表示するために使用できます。

于 2012-11-06T12:19:40.697 に答える
0

直後の :

(($#== 0))&& set-* .suite

$ 1が空(-zを使用)であるかどうかをテストします。これは、*。suiteという名前のファイルがないことを意味します。

于 2012-11-06T12:30:01.980 に答える
0
ls -al | grep "\.suite";echo $?

これは、ファイルが存在する場合は0、ファイルが存在しない場合は1を表示します。

于 2012-11-06T11:57:16.613 に答える
0

次のように、すべてのスイートファイルを繰り返し処理します。

for i in *.suite ; do
    if [ -x $i ] ; then
        echo running $i
    fi
done
于 2012-11-06T11:58:32.820 に答える