for 루프를 사용하여 함수를 만드는 방법은 무엇입니까?

for 루프를 사용하여 함수를 만드는 방법은 무엇입니까?

for 루프를 사용하여 Arch 설치 스크립트에서 비밀번호를 선택하는 함수를 만들려고 합니다.쉬운 아치) 다음 코드를 사용합니다.이것반복되는 프롬프트에 대한 답변 및이것읽을 개행을 추가하기 위한 것):

#!/bin/bash
errEcho() { echo -e "${BOLD}${BRED}[ ${BBLUE}•${BRED} ] $1${RESET}"; }
for type in encrypt user root; do
    pick_${type}pass() {
            read -rsp "Enter $type password: " ${type}pass
            read -rsp $'\nVerify password: ' ${type}pass2
            echo
            if [ "$typepass" != "$typepass2" ]; then
                errEcho "Passwords don't match."
                return 1
            fi
            return 0
    }
done
until pick_userpass; do : ; done

실행할 때 다음 오류가 발생합니다(스크립트가 종료될 때까지 마지막 줄은 스팸 처리됩니다).

./looptest.sh: line 3: `pick_${type}pass': not a valid identifier
./looptest.sh: line 3: `pick_${type}pass': not a valid identifier
./looptest.sh: line 3: `pick_${type}pass': not a valid identifier
./looptest.sh: line 15: pick_userpass: command not found

이 문제를 해결하는 방법을 아는 사람이 있나요?

답변1

짧은 대답: 아니요. 함수를 사용하고 매개변수를 전달하세요. 연관 배열을 사용하십시오.

pick_pass() {
    local type=$1
    local pass pass2
    while true; do
        read -rsp "Enter $type password: " pass
        read -rsp $'\nVerify password: ' pass2
        echo
        [[ "$pass" == "$pass2" ]] && break
        errEcho "Passwords don't match."
    done
    password[$type]=$pass
}

declare -A password

for type in encrypt user root; do
    pick_pass $type
done

declare -p password

구체적으로 명시되지는 않았지만 실행해 보세요.

declare -p password
Enter encrypt password:
Verify password:
Enter user password:
Verify password:
Enter root password:
Verify password:
bash: errEcho: command not found
Enter root password:
Verify password:
declare -A password=([encrypt]="foo" [root]="asdf" [user]="bar" )

관련 정보