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