私は小文字と数字のすべての組み合わせを生成し、それをエコーするスクリプトを作成しました。うまくいきますが、追加したい新しいキャラクターごとに新しい機能を作成する必要がある現在のアプローチよりも、新しいキャラクターを追加するプロセスを単純化する方法があるかどうか疑問に思います。これは私のスクリプトです。
declare -r LIST=$(echo {a..z} {0..9})
function word_generation_2 {
for char1 in ${LIST}; do
for char2 in ${LIST}; do
echo ${char1}${char2}
done
done
}
function word_generation_3 {
for char1 in ${LIST}; do
for char2 in ${LIST}; do
for char3 in ${LIST}; do
echo ${char1}${char2}${char3}
done
done
done
}
function word_generation_4 {
for char1 in ${LIST}; do
for char2 in ${LIST}; do
for char3 in ${LIST}; do
for char4 in ${LIST}; do
echo ${char1}${char2}${char3}${char4}
done
done
done
done
}
function word_generation_5 {
for char1 in ${LIST}; do
for char2 in ${LIST}; do
for char3 in ${LIST}; do
for char4 in ${LIST}; do
for char5 in ${LIST}; do
echo ${char1}${char2}${char3}${char4}${char5}
done
done
done
done
done
}
for ((i = 2; i < 6; i++)); do
word_generation_${i}
done
出力は次のとおりです
aa
...
99999
私はそのまま維持したい。まず、2つの文字で構成されるすべての組み合わせ、次には3つの文字で構成されたすべての組み合わせなどです。
ベストアンサー1
Bashか他のサポートからソート、文字セットを配列に配置してから、配列を再度繰り返すことで文字を前に追加します。
chars=( {a,b,c} )
doubles=()
triplets=()
for c in "${chars[@]}" ; do
doubles+=( ${chars[@]/#/$c} )
done
for c in "${chars[@]}" ; do
triplets+=( ${doubles[@]/#/$c} )
done
echo "${triplets[@]}"
印刷するとaaa aab aac ... ccc
、必要に応じてより長い内容を繰り返すか、再帰機能に切り替えることができます。 (${var//}
これはパターン交換ここで#
文字列の先頭を表示します。配列に適用すると、次に適用されます。みんな値を一度に1つずつ配列します。 )