中かっこ(順列)と配列拡張を同時に使用できますか?

中かっこ(順列)と配列拡張を同時に使用できますか?

Bashの中{}括弧拡張構文を使用すると、単純な置換を生成できます。

# echo {b,c,d}{a,e,i,o,u}
ba be bi bo bu ca ce ci co cu da de di do du

$() echoしかし、非常に厄介な使用を除いて、これを配列で使用できるかどうかを使用することは私には明らかではありません。eval

中かっこ(順列)拡張を使用して配列を使用する簡単な方法はありますか?

たとえば、次のことを想像してみてください(もちろんこれは機能しません)。

CONS=( b c d )
VOWEL=( a e i o u )

echo {${CONS[@]}}{${VOWEL[@]}}

答え1

eval を使用するかIFS=,; "${array[*]}"(値をカンマで連結する)、2 つの for ループを使用できます。

$ CONS=(b c d);VOWEL=(a e i o u)
$ IFS=,;eval echo "{${CONS[*]}}{${VOWEL[*]}}"
ba be bi bo bu ca ce ci co cu da de di do du
$ for c in "${CONS[@]}";do for v in "${VOWEL[@]}";do echo "$c$v";done;done|paste -sd' ' -
ba be bi bo bu ca ce ci co cu da de di do du

答え2

これは可能ですzsh

$ CONS=( b c d )
$ VOWEL=( a e i o u )
$ echo $^CONS$^VOWEL
ba be bi bo bu ca ce ci co cu da de di do du

またはes:

; VOWEL=( a e i o u )
; CONS=( b c d )
; echo $VOWEL^$CONS
ab ac ad eb ec ed ib ic id ob oc od ub uc ud

bashor を使用すると、ksh93次のような複雑な作業を行う必要があります。

VOWEL=( a e i o u )
CONS=( b c d )
qVOWEL=$(printf %q, "${VOWEL[@]}")
qCONS=$(printf %q, "${CONS[@]}")
eval "echo {${qVOWEL%,}}{${qCONS%,}}"

答え3

興味深いですが、おそらく最高ではありません。

temparr=( b{a,e,i,o,u} c{a,e,i,o,u} d{a,e,i,o,u} )
echo "${temparr[@]}"

関連情報