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