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是一个 shell 选项,它使未找到的通配符模式扩展为空,而不是扩展为通配符模式本身。一旦$FILES设置为文件列表或什么都没有,我们可以-z用来测试是否为空,并显示适当的错误消息。

于 2012-11-06T12:19:40.697 回答
0

紧接着:

(($# == 0)) && 设置 -- *.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 回答