用两个数组进行花括号扩展以进行每个组合

Curly brace expansion with two arrays to make every combination

我可以使用花括号和 .. 进行如下组合:

$ 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}"

大括号 {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

看到它正在工作(有意使用一些 hostile/tricky 样本数据)

您可以使用 GNU parallel 完全按照您的要求进行操作:

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

(如果你想在一行中输出,你可以将输出通过管道传输到 tr -s "\n" " "parallel echo {} ::: "${arr1[@]}" ::: "${arr2[@]}" | tr -s "\n" " "