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; "
$~
我尝试了多种变体,无法弄清楚我的错误。有人能发现问题吗?
谢谢!
答案 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
。