分配给变量的Bash命令保持为空

时间:2016-11-10 09:32:29

标签: linux bash shell variables xargs

xargs之后我几个命令跟在一起。有趣的是,只要将它回显到stdout,该命令就可以正常工作。当我尝试将其分配给变量时,变量保持为空。见下文:

$~ ./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; "







$~

我尝试了多种变体,无法弄清楚我的错误。有人能发现问题吗?

谢谢!

2 个答案:

答案 0 :(得分:2)

您需要转义$命令的sh -c字符,否则$( )$sample部分将由当前shell而不是{{1}处理}}

sh -c

或者您可以考虑使用单引号进行外引号。

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

答案 1 :(得分: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