我目前正在编写一个bash脚本来执行测试套件。除了将套件直接传递给此脚本,例如
./bash-specs test.suite
如果没有套件传递给它,它也应该能够在给定目录中执行所有脚本,例如So
./bash-specs # executes all tests in the directory, namely test.suite
这是像这样实现的
(($# == 0)) && set -- *.suite
因此,如果没有通过套件,则执行所有结尾的文件。这可以正常工作,但如果目录中没有此类文件,则会失败。
这意味着我还需要检查以测试是否实际上有该结尾的文件。我将如何在bash中这样做?
我认为像
这样的测试[[ -f *.suite ]]
应该有效,但是当目录中有多个文件时,似乎失败了。
-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
来测试空虚,并显示适当的错误消息。
ls -al | grep ".suite";echo $?
如果存在文件,则将显示0,如果不存在文件,则会显示1
我会在这样的每个套件文件上迭代:
for i in *.suite ; do
if [ -x $i ] ; then
echo running $i
fi
done
之后:
(($#== 0))&&设置 - *.suite
测试$ 1是否为空(使用-Z),则表示没有名为 *.suite的文件。