我试图运行需要在单引号或双引号中传递参数的应用程序:
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 :(得分: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