Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sql-server-2005/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash 将文件按(*)星型字符添加到for循环中的变量_Bash_Loops_File_Variables - Fatal编程技术网

Bash 将文件按(*)星型字符添加到for循环中的变量

Bash 将文件按(*)星型字符添加到for循环中的变量,bash,loops,file,variables,Bash,Loops,File,Variables,我有一个文件夹结构,其中两个文件位于一个文件夹中。这些文件的名称很长,但由R1和R2区分注意,我使用for循环在多个文件夹上运行此操作,但在本例中保持简单。我正在运行循环,我想知道如何正确调用带有(*)星号的文件以自动完成,而不必键入所有文件名。我的尝试如下: #!/bin/bash for item in Folder_Directory: do forward=$item/*R1* reverse=$item/*R2* bbmap.sh ref=reference.fna in1=$for

我有一个文件夹结构,其中两个文件位于一个文件夹中。这些文件的名称很长,但由R1和R2区分注意,我使用for循环在多个文件夹上运行此操作,但在本例中保持简单。我正在运行循环,我想知道如何正确调用带有(*)星号的文件以自动完成,而不必键入所有文件名。我的尝试如下:

#!/bin/bash

for item in Folder_Directory:
do
forward=$item/*R1*
reverse=$item/*R2*
bbmap.sh ref=reference.fna in1=$forward in2=$reverse outu=Unmapped.fasta
done
我得到的输出是错误的,因为变量没有标识所需的文件:

错误:

align2.BBMap build=1 overwrite=true fastareadlen=500 ref=reference.fna 
in1=Folder_Dictory/*R1* in2=Folder_Dictory/*R2* outu=Folder_Dictory/Unmapped.fastq

但是,在本例中,当我扩展此循环以包含多个不再理想的文件夹时,我可以自动完成文件。使用(*)字符自动完成是我的第一种方法,非常感谢您对我的问题提出的任何其他建议或解决方案。

如果您只需要
文件夹结构中的两个文件
,然后我认为最好使用
find
搜索文件,然后根据您的要求将其分配到单独的变量中……这里没有看到
for
循环的用法

forward=$(find Folder_Directory -type f -name "*R1*")
reverse=$(find Folder_Directory -type f -name "*R2*")
bbmap.sh ref=reference.fna in1="$forward" in2="$reverse" outu=Unmapped.fasta
它的工作原理如下:

test=f*
$ echo $test 
file
test3="$(echo $test)"
$ echo "$test" "$test2" "$test3"
f* f* file
但是

要使其工作,您必须执行以下操作:

test=f*
$ echo $test 
file
test3="$(echo $test)"
$ echo "$test" "$test2" "$test3"
f* f* file

问题是shell在1=Folder\u Dictory/*R1*中看到
in1=
前缀,并注意到没有与glob匹配的文件,因此通配符根本不会展开

您可能希望在将通配符传递给命令之前对其求值,例如

for item in Folder_Directory:
do
  forward=$item/*R1*
  reverse=$item/*R2*
  bbmap.sh ref=reference.fna in1="$(echo $forward)" in2="$(echo $reverse)" outu=Unmapped.fasta
done

如果通配符扩展到多个文件,这当然仍然是不稳定的。

这样做了,谢谢!关于是否有多个文件具有该扩展名,这一点很好,谢天谢地,在本例中这是不适用的。我感谢你的答复。