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