2016-10-19 1 views
3

Je veux utiliser les aruments de la xargs que l'indice de ce tableau, ce sont les scripts:Comment utiliser les arguments de `xargs` comme l'indice d'un tableau

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]} 

et c'est la sortie:

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

Vous pouvez voir que le tableau ne peut pas accepter l'index correctement, c'est toujours le premier. Comment puis-je obtenir ce genre de sortie:

array : x, y 
0,x 
1,y 

J'ai montré l'exemple avec la commande echo, cependant, mon vrai but est d'une autre commande, comme ceci:

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

pour que je veux un solution générale de cette question.
Et j'ai également essayé le parallel au lieu du xargs, il a le même problème.

+1

Cela ne peut pas éventuellement travailler comme vous voulez, car le tableau n'existe que dans le shell et 'xargs' fonctionne en créant des processus fils. Le contenu de '$ {...}' dans la ligne de commande xargs n'est développé qu'une seule fois avant l'exécution de xargs. Vous devrez soit rendre le tableau disponible pour les processus enfants, soit réécrire le xargs en tant que boucle shell. –

+0

@ WumpusQ.Wumbley OK, cependant, je veux utiliser le 'xargs' pour faire parallèle, donc une boucle de shell ne pourrait pas être une bonne solution :( –

+0

Vous pouvez essayer de mettre le tableau comme une liste dans l'environnement et l'utiliser dans la commande commencée avec 'xargs', mais il pourrait y avoir des cas de coin ... –

Répondre

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

oui, c'est un peu loin pour éviter ce genre de problème Cependant, vos scripts devraient être corrigés un peu:' for i in \ 'seq 0 \ 'expr $ {# array [@]} - 1 \' \ '' –

0

Avec GNU parallèle vous pouvez faire:

#!/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[{}]}' 

Votre problème se résume à des réseaux d'exportation, que vous ne pouvez pas faire sans tricher: Exporting an array in bash script