bash - 测试目录是否包含以.suite结尾的文件

时间:2012-11-06 11:51:07

标签: bash

我正在编写一个用于执行测试套件的bash脚本。除了将套件直接传递给这个脚本,比如

./bash-specs test.suite

如果没有传递套件,它也应该能够执行给定目录中的所有脚本,如此

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

这是像这样实现的

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

因此,如果没有传递套件,则执行以.suite结尾的所有文件。这样可以正常工作,但如果目录中不包含此类文件则会失败。

这意味着我还需要检查以确定是否存在具有该结尾​​的文件。 我怎么在bash中这样做?

我认为像

这样的测试
[[ -f *.suite ]]

应该可以工作,但是当目录中有多个文件时它似乎失败了。

4 个答案:

答案 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的文件。