ループを繰り返さない 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シェルスクリプトでエラーを見つけます。

おすすめ記事