2016-12-15 92 views
0

我试图运行需要在单或双引号传递参数的应用程序:引用变量

bwa mem -R '@RG\tID:foo\tLB=foo\tPL=illumina\tPU=1234.1\tSM=bar'...

我想在脚本运行此:

#!/usr/bin/bash 

var=foo_bar 
first=$(echo $var | cut -d '_' -f 1) 
second=$(echo $var | cut -d '_' -f 2) 

readgroup="@RG\tID:$first\tLB=HUM\tPL=illumina\tPU=1234.1\tSM=$second" 

echo \'$readgroup\' 

'@RG\tID:foo\tLB=HUM\tPL=illumina\tPU=1234.1\tSM=bar' 

然而,当我用这个作为我的应用程序调用的参数:

var=foo_bar 
first=$(echo $var | cut -d '_' -f 1) 
second=$(echo $var | cut -d '_' -f 2) 

readgroup="@RG\tID:$first\tLB=HUM\tPL=illumina\tPU=1234.1\tSM=$second" 

bwa mem -R \'$readgroup\' ... 

它解释为

\'@RG\tID:HUM-7\tLB=HUM\tPL=illumina\tPU=1234.1\tSM=HUM-7\'

我在做什么错?

回答

0

应该是这样的:

readgroup="'@RG\tID:$first\tLB=HUM\tPL=illumina\tPU=1234.1\tSM=$second'" [with '' wrapping] 

readgroup="@RG\tID:$first\tLB=HUM\tPL=illumina\tPU=1234.1\tSM=$second" [without] 

重要的是使用回声-e选项[见man echo]

echo -e $readgroup 
+0

谢谢,但我想使用变量作为另一个程序的输入 - 在这种情况下如何使用'echo -e'? – fugu

1

应用程序不关心报价;它们仅用于保护来自外壳的字符串。

var=foo_bar 
IFS=_ read first second <<< "$var" 

readgroup="@RG\tID:$first\tLB=HUM\tPL=illumina\tPU=1234.1\tSM=$second" 

bwa mem -R "$readgroup" 

如果\t实际上应该是字面制表符,可以考虑使用printf而不是赋值语句。

printf -v readgroup '@RG\tID:%s\tLB=HUM\tPL=illumina\tPU=1234.1\tSM=%s' "$first" "$second"