首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >重定向命令输出时不计算变量的Bash

重定向命令输出时不计算变量的Bash
EN

Stack Overflow用户
提问于 2019-06-07 19:32:12
回答 1查看 56关注 0票数 0

我想要一个shell脚本来处理许多输入文件。我使用变量作为输入名称和重命名中间文件。无法将输出重定向到文件名。

shell脚本的运行方式如下:

代码语言:javascript
复制
./trim_pair_align_ab1.sh 116102 128861

脚本可以正确地回显变量(第15和第16行),它们与期望匹配。

代码语言:javascript
复制
./temp/45739_1_PET22-001_116102_00_trim.fastq
./temp/45739_1_PET22-001_116102_00_trim.fasta

当命令重定向输出时,它无法计算文件名

代码语言:javascript
复制
line 17: temp/$(echo $f|sed 's/_trim.fastq/_trim.fasta/'): No such file or directory
代码语言:javascript
复制
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行成为文字而不是评估?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-06-07 20:22:46

命令替换正在展开;shell只是打印给它的代码,而不是该扩展的结果。对于真正的问题,你会想要看得更远。

仔细查看您的echo,显示命令替换的结果:

代码语言:javascript
复制
./temp/45739_1_PET22-001_116102_00_trim.fasta

已经有了./temp前缀。

当您在重定向(>./temp/$(...))中添加第二个这样的前缀时,您的代码将尝试在./temp/temp/中创建一个文件。这个目录不存在,所以您会得到一个错误。

尽管如此,更好的实现方式如下:

代码语言:javascript
复制
for f in ./temp/*"$1"*_trim.fastq; do
  seqtk seq -A "$f" >"${f%.fastq}.fasta"
done
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56500273

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档