2016-11-10 48 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

不,我做了不是 - 分配给'sample'的想法是在xargs命令后面使用的 - 我认为这对我不适用) – dmeu

回答

2

你需要躲避$字符为sh -c命令,否则$()$sample部分将由当前shell来处理,而不是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,而不是试图通过嵌入结果动态地创建一个shell命令。 (另外,除非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" _ {} 

_是一个虚拟参数,用于在shell中设置$0