2016-10-19 86 views
3

我想用從xargs因爲這數組的索引aruments,這是腳本:如何使用參數從`xargs`作爲數組的索引

1 #!/bin/bash 
2 array[0]=x 
3 array[1]=y 
4 echo array : ${array[0]}, ${array[1]} 
5 echo -n {0..1} | xargs -I index -d" " echo index,${array[index]} 

,這是輸出:

[[email protected] scripts]$ sh test.sh 
array : x, y 
0,x 
1,x 

您可以看到數組無法正確接受索引,它始終是第一個。我怎樣才能得到這樣的輸出:

array : x, y 
0,x 
1,y 

我發現用命令echo的例子,但是,我真正的目的是另一個命令,就像這樣:

echo -n {0..1} | xargs -I index -d" " somecommand ${array[index]} 

,這樣我想這個問題的一般解決方案。
而且我也試過parallel而不是xargs,它有同樣的問題。

+1

這不可能工作,你所希望的方式,因爲該數組只存在於shell中,'xargs'通過創建子進程來工作。在執行xargs之前,xargs命令行中的'$ {...}'內容僅擴展一次。您必須將該數組設置爲子進程,或者將xargs重寫爲shell循環。 –

+0

@ WumpusQ.Wumbley好的,但是,我想用'xargs'做並行,所以shell循環不能成爲一個合適的解決方案:( –

+0

你可以嘗試把數組作爲一個列表在環境中,並使用在'xargs'開始的命令中,但可能存在轉角情況... –

回答

1
for i in `seq 0 $[${#array[@]}-1]`;do echo $i,${array[$i]};done|xargs -n1 echo 
+1

是的,這是一種避免這種問題的方式,但是,您的腳本應該稍微糾正一下:'for i in \'seq 0 \ 'expr $ {#array [@]} - 1 \'''' –

0

隨着GNU並行,你可以這樣做:

#!/bin/bash 

. `which env_parallel.bash` 

array[0]=x 
array[1]=y 
echo array : ${array[0]}, ${array[1]} 
echo -n {0..1} | env_parallel -d" " echo '{},${array[{}]}' 
# or 
echo -n {0..1} | env_parallel --env array -d" " echo '{},${array[{}]}' 

你的問題歸結於出口數組,你不能沒有作弊做:Exporting an array in bash script