Кавычка переменной в вызове приложения
Я пытаюсь запустить приложение, которому нужен параметр, передаваемый в одинарных или двойных кавычках:
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