Bash重定向命令输出时不评估变量

时间:2019-06-07 19:32:12

标签: bash

我想要一个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行变成文字而不是被评估?

1 个答案:

答案 0 :(得分:2)

正在扩展命令替换 ; Shell只是在打印您提供的代码,而不是扩展的结果。对于真正的问题,您需要进一步了解。


仔细查看您的@ManyToOne,其中显示了命令替换的结果:

echo

已经有前缀./temp/45739_1_PET22-001_116102_00_trim.fasta

当您在重定向(./temp)中添加第二个此类前缀时,您正在使代码尝试在>./temp/$(...)中创建文件。该目录不存在,因此会出现错误。


也就是说,更好的实现应如下所示:

./temp/temp/