在应用程序调用中引用变量

时间:2016-12-15 14:09:07

标签: bash quotations

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

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\'

我做错了什么?

2 个答案:

答案 0 :(得分: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"

答案 1 :(得分: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]

重要的是对echo使用-e选项[请参阅man echo]

echo -e $readgroup