Кавычка переменной в вызове приложения

Я пытаюсь запустить приложение, которому нужен параметр, передаваемый в одинарных или двойных кавычках:

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 ответа

Приложение не заботится о кавычках; они используются только для защиты строки от оболочки.

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"

Должно быть как:

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
Другие вопросы по тегам