用两个数组进行花括号扩展以进行每个组合
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" " "
我可以使用花括号和 ..
进行如下组合:
$ 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" " "