루프를 반복하지 않는 Bash 중첩 루프

루프를 반복하지 않는 Bash 중첩 루프

drupal에서 사용자 계정을 생성하기 위해 drush를 사용하는 for 루프 내에 while 루프가 있지만 시퀀스를 올바르게 반복하지 않습니다. 계정이나 모든 도메인을 생성하는 것은 잘 작동하지만 while 루프는 첫 번째 계정 이후에 사용자 역할을 생성하지 않습니다. 내 실수를 본 사람이 있나요?

#add the user
USERLIST=(
        "$USER,page_creator" 
        #"$USER,layout_manager"
        "$USER,page_reviewer" 
        "$USER,landing_page_creator"
        "$USER,landing_page_reviewer"
        "$USER,media_manager"
        "$USER,block_creator"
        #"$USER,site_builder"
        "$USER,block_manager"
    )

count=0

DOMAINLIST=("lmn" "pdq" "xyz")
for SITE in "${DOMAINLIST[@]}"
do
    echo "Creating account for $USER"
    drush "@company-acsf."$SITE ucrt $USER --password="$PW" --mail="$USER"
        while [ "x${USERLIST[count]}" != "x" ]
        do
            count=$(( $count + 1 ))
            IFS=',' read -ra LINE <<< "${USERLIST[count]}"
            USERNAME=${LINE[0]}
            USERROLE=${LINE[1]}     

            if [[ -n "$USERNAME"  && -n "$USERROLE" ]] ; then
                echo "Updating account for $USERNAME with role \"$USERROLE\""
                drush "@company-acsf."$SITE urol "${USERROLE}" $USERNAME
            fi
        done
done
exit 0

답변1

앞서 언급했듯이 이 count변수는 for 루프 외부에서 초기화되지만 첫 번째 while 루프 이후에는 재설정되지 않습니다. 또 다른 문제는 count변수를 너무 일찍 추가하고 문자를 page_creator건너뛰는 것입니다. 비밀번호 PW도 설정되어 있지 않은데 스크립트의 일부만 보여주신 것 같습니다.

while 루프를 다음과 같은 for 루프로 변경할 수 있습니다(몇 가지 사소한 개선 사항은 주석 참조).

#!/bin/bash
### ^^^^^^^ add shebang

#add the user
USERLIST=(
        "$USER,page_creator"
        #"$USER,layout_manager"
        "$USER,page_reviewer"
        "$USER,landing_page_creator"
        "$USER,landing_page_reviewer"
        "$USER,media_manager"
        "$USER,block_creator"
        #"$USER,site_builder"
        "$USER,block_manager"
    )

### remove
#count=0
DOMAINLIST=("lmn" "pdq" "xyz")
for SITE in "${DOMAINLIST[@]}"; do

    ### add SITE name to echo
    echo "Creating account for $USER, site \"$SITE\""
    drush "@company-acsf."$SITE ucrt $USER --password="$PW" --mail="$USER"

    ### change while-loop to for-loop
    for ((count=0; count < ${#USERLIST[@]}; count++)); do
    #while [ "x${USERLIST[count]}" != "x" ]
    #do
        ### remove
        #count=$(( $count + 1 ))
        IFS=',' read -ra LINE <<< "${USERLIST[count]}"
        USERNAME=${LINE[0]}
        USERROLE=${LINE[1]}
        if [[ -n "$USERNAME"  && -n "$USERROLE" ]]; then
            echo "Updating account for $USERNAME with role \"$USERROLE\""
            drush "@company-acsf."$SITE urol "${USERROLE}" $USERNAME
        fi
    done
done

### probably not needed, exit status is the status of the last command
#exit 0

연습으로 남겨두세요:변수를 소문자로 변경모든 변수를 참조하십시오. 사용shellcheck.net쉘 스크립트에서 오류를 찾으십시오.

관련 정보