Расширение фигурных скобок с двумя массивами для создания каждой комбинации - PullRequest
1 голос
/ 26 февраля 2020

Я могу использовать фигурные скобки и .. для создания комбинаций следующим образом:

$ echo {"foo","bar"}{1..2}
foo1 foo2 bar1 bar2

Если у меня есть два массива arr1=("foo" "bar") и arr2=(1 2), возможно ли достичь одного и того же?

Например, что-то вроде:

$ echo ${arr1[@]}${arr2[@]}       # Returns "foo bar1 2"
or
$ echo {${arr1[@]}}{${arr2[@]}}   # Returns "{foo bar}{1 2}"

Ответы [ 2 ]

2 голосов
/ 26 февраля 2020

Раскрытие скобки {1..2} происходит до раскрытия переменной, поэтому сделать это невозможно без eval.

. Просто переберите два массива и создайте все возможные комбинации

for i in "${arr1[@]}"; do
   for j in "${arr2[@]}"; do
      echo "$i$j"
    done
done

Или вы можете использовать eval. Чтобы сделать это безопасно, используйте printf %q, чтобы сгенерировать надежно цитируемые версии содержимого вашего массива, например:

printf -v arr1_str '%q,' "${arr1[@]}"; arr1_str=${arr1_str%,}
printf -v arr2_str '%q,' "${arr2[@]}"; arr2_str=${arr2_str%,}
eval "printf '%s\n' {${arr1_str}}{${arr2_str}}"

..., которые вы можете видеть работающими (с некоторыми намеренно враждебными / хитрыми примерами данных) в https://ideone.com/HunmC3

1 голос
/ 27 февраля 2020

Вы можете делать в точности то, что вы просили, параллельно с GNU:

parallel echo {} ::: "${arr1[@]}" ::: "${arr2[@]}"

(если вы хотите вывод в одну строку, вы можете передать вывод в tr -s "\n" " ": parallel echo {} ::: "${arr1[@]}" ::: "${arr2[@]}" | tr -s "\n" " "

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...