由于空格导致的通配错误

由于空格导致的通配错误

我的目录变量

POSTMAP="/work/Documents/Projects/untitled\ folder/untitled\ folder/*/*_tsta.bam"

我的 for 声明:

for file0 in ${POSTMAP}; do
...

看来“无标题文件夹”中的空格与通配符混淆了。我怀疑这是因为 file0 最终成为“/untitled”。请注意,我有“shopt -s extglob”。

答案1

这不是真的搞乱通配符。在这里,通过使用$POSTMAP不带引号的,您正在使用 split+glob 运算符。

使用默认值$IFS, 在您的 上/work/Documents/Projects/untitled\ folder/untitled\ folder/*/*_tsta.bam,它会首先将其拆分为"/work/Documents/Projects/untitled\","folder/untitled\""folder/*/*_tsta.bam"。只有第三个包含通配符,因此受 glob 部分的约束。但是,glob 只会搜索folder相对于当前目录的目录中的文件。

如果您只需要该运算符的glob一部分而不是其,请设置为空字符串。对于该运算符,反斜杠不能用于转义分隔符(但仅在类似 Bourne 的 shell 中),它可以用于转义通配符全局运算符。splitsplit+glob$IFS$IFSbashbash

所以要么:

POSTMAP="/work/Documents/Projects/untitled folder/untitled folder/*/*_tsta.bam"
IFS=   # don't split
set +f # do glob
for file0 in $POSTMAP # invoke the split+glob operator
do...

或者使用支持 、 、 、 等数组的 shellbash可能yashzsh更好ksh

postmap=(
  '/work/Documents/Projects/untitled folder/untitled folder/'*/*_tsta.bam
) # expand the glob at the time of that array assignment
for file0 in "${postmap[@]}" # loop over the array elements
do....

相关内容