ブレース(順列)と配列拡張を同時に使用できますか?


12

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

しかし、それは非常に厄介な使用を除き、アレイと一緒にこれを使用することが可能ですか/場合私にははっきりしていない$() echoeval

中括弧(順列)展開で配列を使用する簡単な方法はありますか?

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

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

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

別にしたい場合は、GNU bash, version 4.2.24 出力で機能しroot@router:~# echo {${CONS[@]}}{${VOWEL[@]}} {b c d}{a e i o u}.ます。その場合はお知らせください.. `
Rahul Patil

3
OPが望んでba be bi bo bu ca ce ci co cu da de di do duいる@RahulPatil 。
terdon

回答:


10

eval with 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

9

それは可能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

bashksh93、あなたは次のように回旋何かをする必要があると思います。

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

2
zshを使用するもう1つの理由。
ケビン

bashでこれを行う直接的な方法がないことは確かですか?それともそうだと思いますか?
Catskul 2013

@Catskul、いや、私はそれを強く疑いますが、確かではありません。多くの機能が文書化されていないksh93については、さらに確実ではありません。しばらくの間、質問を開いたままにすることをお勧めします。別のレベルの評価(evalまたは.)なしで中括弧を展開することはできません。
ステファンChazelas

eval "echo {$(printf ',%s' "${CONS[@]}" "${VOWEL[@]}" | tail -c+2)}"(ただし、単一要素では機能しません。)
Rockallite 2017

2

楽しいが、おそらく最高ではない。

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

正しいですが、母音を繰り返す必要があります。これは、質問からは暗示されていません(静的リストをCONSとVOWELにそれぞれ割り当てる)。
ジェフシャラー
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.