我想要一个shell脚本来处理许多输入文件。我正在使用变量作为输入名称并重命名中间文件。我无法将输出重定向到文件名。
shell脚本是这样运行的:
./trim_pair_align_ab1.sh 116102 128861
脚本可以正确地回显变量(第15和16行),并且它们符合期望。
./temp/45739_1_PET22-001_116102_00_trim.fastq
./temp/45739_1_PET22-001_116102_00_trim.fasta
当命令重定向输出时,它无法评估文件名
line 17: temp/$(echo $f|sed 's/_trim.fastq/_trim.fasta/'): No such file or directory
8 for f in *.fastq
9 do
10 seqtk trimfq -q 0.05 $f > ./temp/$(echo $f|sed 's/.fastq/_trim.fastq/')
11 done
12
13 for f in `eval ls ./temp/*$1*_trim.fastq`;
14 do
15 echo $f
16 echo $(echo $f|sed 's/_trim.fastq/_trim.fasta/')
17 seqtk seq -A $f > ./temp/$(echo $f|sed 's/_trim.fastq/_trim.fasta/')
18 done
为什么输出重定向在第10行而不在第17行起作用? 是什么使第17行变成文字而不是被评估?
答案 0 :(得分:2)
正在扩展命令替换 ; Shell只是在打印您提供的代码,而不是扩展的结果。对于真正的问题,您需要进一步了解。
仔细查看您的@ManyToOne
,其中显示了命令替换的结果:
echo
它已经有前缀./temp/45739_1_PET22-001_116102_00_trim.fasta
。
当您在重定向(./temp
)中添加第二个此类前缀时,您正在使代码尝试在>./temp/$(...)
中创建文件。该目录不存在,因此会出现错误。
也就是说,更好的实现应如下所示:
./temp/temp/