2016-11-10 4 views
0

У меня есть несколько команд, следующих друг за другом после xargs. Как ни странно, команда отлично работает, если просто откликнуться на stdout. Когда я пытаюсь назначить его переменной, переменная остается пустой. Смотрите ниже:Команда Bash, присвоенная переменной, остается пустой

$~ ./somescript | grep -f fc.samples | xargs -I {} sh -c "echo {} | tr '/' '\t' | cut -f9;" 
sample1 
sample2 
sample3 
sample4 
sample5 
sample6 
sample7 
sample8 
$~ 

Попытка присвоить его переменной, а затем повторить это приводит пустые строки:

$~ ./somescript | grep -f fc.samples | xargs -I {} sh -c "sample=$(echo {} | tr '/' '\t' | cut -f9); echo $sample; " 







$~ 

Я попробовал несколько вариантов этого и не могу понять, что я получаю неправильно. Может ли кто-нибудь определить проблему?

Спасибо!

+1

Вы попробовали это? 'sample = $ (./ somescript | grep -f fc.samples | xargs -I {} sh -c" echo {} | tr '/' '\ t' | cut -f9; ")' –

+0

Нет, я сделал not - идея присвоения 'sample' для последующего использования в командах xargs - я думаю, что это не сработает для меня;) – dmeu

ответ

2

Вы должны избежать $ символов для команды sh -c, иначе $() и $sample часть будет обрабатываться текущей оболочки, а не sh -c.

... | xargs -I {} sh -c "sample=\$(echo {} | tr '/' '\t' | cut -f9); echo \$sample; " 

Или вы можете использовать одиночные кавычки для внешнего цитирования.

... | xargs -I {} sh -c 'sample=$(echo {} | tr "/" "\t" | cut -f9); echo $sample; ' 
+0

Отлично! Ответить переключения ... Спасибо за вашу помощь - место на! – dmeu

0

Это лучше передать аргумент вsh, а не пытаться динамически создать команду оболочки путем внедрения результата. (Кроме того, если цель tr не создавать дополнительные поля в строке, как foo/bar\tbaz, вы можете просто сказать cut использовать / в качестве разделителя полей вместо использования по умолчанию лепестка.)

# script='sample=$(echo "$1" | cut -d/-f9); echo "$sample"' 

script='sample=$(echo "$1" | tr '/' '\t' | cut -f9); echo "$sample"' 
./somescript | grep -f fc.samples | 
    xargs -I {} sh -c "$script" _ {} 

_ - фиктивный аргумент, используемый для установки $0 в оболочке.

Смежные вопросы