Как использовать аргументы из `xargs` в качестве индекса массива

Я хочу использовать аргументы из 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]}

и это вывод:

[usr@linux 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, у него та же проблема.


person spring cc    schedule 19.10.2016    source источник
comment
Это не может работать так, как вы хотите, потому что массив существует только в оболочке, а xargs работает, создавая дочерние процессы. Элемент ${...} в командной строке xargs раскрывается только один раз, перед выполнением xargs. Вам придется либо сделать массив доступным для дочерних процессов, либо переписать xargs как цикл оболочки.   -  person    schedule 19.10.2016
comment
@WumpusQ.Wumbley Хорошо, однако я хочу использовать xargs для параллельного выполнения, поэтому цикл оболочки не может быть правильным решением :(   -  person spring cc    schedule 19.10.2016
comment
Вы можете попытаться поместить массив в виде списка в среду и использовать его в команде, начинающейся с xargs, но могут быть крайние случаи...   -  person Serge Ballesta    schedule 19.10.2016


Ответы (2)


С помощью GNU Parallel вы можете:

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

Ваша проблема сводится к экспорту массивов, без читерства не обойтись: Экспорт массива в скрипте bash

person Ole Tange    schedule 19.10.2016

person    schedule
comment
да, это далеко, чтобы избежать такого рода проблемы. Однако ваши скрипты стоит немного подправить: for i in `seq 0 `expr ${#array[@]}-1`` - person spring cc; 19.10.2016