2016-10-19 4 views
3
내가이 배열의 인덱스로 xargs에서 aruments를 사용하려면

,이 스크립트입니다 :

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 

배열을 올바르게 색인을 받아 들일 수 없다는 것을 알 수 있습니다. 항상 첫 번째입니다. 이와 같이, 내가 명령 echo으로 예를 보여

array : x, y 
0,x 
1,y 

은, 그러나, 내 진짜 목표는 다른 명령입니다 : : 어떻게 출력의이 종류를 얻을 수

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

을 그래서 내가 원하는 것을 이 질문의 일반적인 해결책.
그리고 나는 xargs 대신 parallel을 시도했지만, 같은 문제가 있습니다.

GNU는 당신이 할 수있는 병렬로
+1

이것은 아마도 당신이 원하는 방식으로 작동하지 않을 수 있습니다, 왜냐하면 배열은 쉘에만 존재하고'xargs'는 자식 프로세스를 생성함으로써 작동하기 때문입니다. xargs 커맨드 라인의'$ {...} '항목은 xargs가 실행되기 전에 한 번만 확장됩니다. 배열을 자식 프로세스에서 사용할 수 있도록 만들거나 xargs를 쉘 루프로 다시 작성해야합니다. –

+0

@ WumpusQ.Wumbley 그렇지만'xargs'를 사용하여 병렬 처리를하고 싶기 때문에 셸 루프가 적절한 해결책이 될 수 없습니다 : ( –

+0

배열을 환경의 목록으로 넣으려고하면 'xargs'로 시작하는 명령에서, 그러나 코너 케이스가있을 수 있습니다 ... –

답변

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

그렇습니다, 이런 종류의 문제를 피할 수 있습니다. 그러나 스크립트는 조금 수정해야합니다 :'for i'\ seq 0 \ 'expr $ {# array [@]} - 1 \'\'' –

0

:

귀하의 문제는 당신이 부정 행위없이 할 수 없어 수출 배열에 종기
#!/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