중첩 루프를 사용하여 단어 생성

중첩 루프를 사용하여 단어 생성

저는 소문자와 숫자의 모든 조합을 생성하고 이를 에코하는 스크립트를 만들었습니다. 작동하지만, 추가하고 싶은 새 캐릭터마다 새 기능을 만들어야 하는 현재 접근 방식보다 새 캐릭터를 추가하는 프로세스를 단순화할 수 있는 방법이 있는지 궁금합니다. 이것은 내 스크립트입니다.

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//}이것은패턴 교체여기서 #문자열의 시작을 표시합니다. 배열에 적용하면 다음에 적용됩니다.모두값을 한 번에 하나씩 배열합니다. )

관련 정보