我想检查目标目录中是否存在与给定模式匹配的文件,因此写入
data_dir="/home"
sample="HT001"
r1Pattern=".R1.gz"
shopt -s nullglob
if [ -f ${data_dir}/${sample}*combined${r1Pattern} ]
then
./myscript
fi
没有/home/HT001_combined.R1.gz
存在。但是这段代码一直告诉我文件存在。我错过了什么吗?
感谢。
答案 0 :(得分:4)
这是因为nullglob
模式。由于该文件不存在,因此glob扩展为空。而且,对于一个空洞的争论,如果您使用-f
,[
将返回true:
$ empty=
$ [ -f $empty ] && echo yes
yes
您可以使用bash
[[
来解决您的问题:
$ [[ -f $empty ]] && echo yes
[[
通常提供更可预测和友好的行为。
编辑:
是的,你是对的,似乎实际上在使用[[
时不评估glob。想到这一点的方式更像是:
f=(${data_dir}/${sample}*combined${r1Pattern})
if (( ${#f[@]} == 1 )) && [[ -f ${f[0]} ]]
then
# ...
fi
这会将glob扩展为一个数组,确保只有一个结果,并验证它是一个常规文件。