Bash使用文件扩展检查文件是否存在

Bash使用文件扩展检查文件是否存在,bash,Bash,我想检查目标目录中是否存在与给定模式匹配的文件,从而写入 data_dir="/home" sample="HT001" r1Pattern=".R1.gz" shopt -s nullglob if [ -f ${data_dir}/${sample}*combined${r1Pattern} ] then ./myscript fi 没有/home/HT001\u组合。R1.gz存在。但这段代码一直告诉我文件存在。有什么我错过的吗 谢谢。这是因为nullglob模式。由于文件不存在,

我想检查目标目录中是否存在与给定模式匹配的文件,从而写入

data_dir="/home"
sample="HT001"
r1Pattern=".R1.gz"
shopt -s nullglob

if [ -f ${data_dir}/${sample}*combined${r1Pattern} ]
then
  ./myscript
fi
没有
/home/HT001\u组合。R1.gz
存在。但这段代码一直告诉我文件存在。有什么我错过的吗


谢谢。

这是因为
nullglob
模式。由于文件不存在,glob扩展为空。并且,对于空参数,
-f
如果使用
[
:

$ 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扩展到一个数组中,确保只有一个结果,并验证它是否为常规文件。

这是因为
nullglob
模式。由于文件不存在,glob会扩展为空。对于空参数,
-f
如果使用
[

$ 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扩展为一个数组,确保只有一个结果,并验证它是否是一个常规文件。

什么是
文件${data\u dir}/${sample}*组合${r1Pattern}
显示?什么是
文件${data\u dir}/${sample}*组合${r1Pattern}
显示?从技术上讲
-f
没有返回true。没有看到它(通过
[
)作为测试参数,而不是作为要使用
-n
进行测试的字符串。同样,如果没有nullglob,这将以其他有趣的方式失败。另外
[
是特定于bash的,只是为了记录。我将[[[,现在如果存在/home/HT001_combined.R1.gz,代码会告诉我没有这样的文件。从技术上讲,
-f
不会返回true。它不会(被
[
)视为测试参数,而是作为要使用
-n
进行测试的字符串。如果没有null glob,这也会以其他有趣的方式失败。还有
[[
是特定于bash的,只是为了记录。我将[更改为[],现在如果存在/home/HT001\u combined.R1.gz,代码告诉我没有这样的文件。