我正在编写一个脚本
它将访问一个文件中的所有变量,并将在另一个脚本中使用这些变量
在var.sh文件中
MYSQL_LOGIN_USER="admin"
MYSQL_LOGIN_PASSWORD="admin@123"
declare -a MYSQL_USERS=("abc" "xyz") # declaring an array for mysql users
declare -a MYSQL_PASSWD=("abc@123" "xyz@123") #declaring an array for mysql passwords
MYSQL_DATABASE="database"
我想访问var.sh文件中声明的数组
在main.sh文件中
source var.sh
echo "create database $MYSQL_DATABASE" | mysql -u $MYSQL_LOGIN_USER -p$MYSQL_LOGIN_PASSWORD
for i in "${MYSQL_USERS[@]}"
do
echo "CREATE USER $i" | mysql -u $MYSQL_LOGIN_USER -p$MYSQL_LOGIN_PASSWORD
echo "GRANT ALL PRIVILEGES ON $MYSQL_DATABASE.* TO $i IDENTIFIED BY $i" | mysql -u $MYSQL_LOGIN_USER -p$MYSQL_LOGIN_PASSWORD
done
在上面的脚本中,我在授予特权时使用了相同的用户名和密码名称
我尝试在for循环中使用逻辑AND [&&]但它无法正常工作
我是否必须使用嵌套for循环??
答案 0 :(得分:2)
@AlastairCampbell几乎是正确的,但您需要索引数组:
for i in "${!MYSQL_USERS[@]}"
do
echo "CREATE USER ${MYSQL_USERS[$i]}" | mysql -u $MYSQL_LOGIN_USER -p$MYSQL_LOGIN_PASSWORD
echo "GRANT ALL PRIVILEGES ON $MYSQL_DATABASE.* TO ${MYSQL_USERS[$i]}" IDENTIFIED BY ${MYSQL_PASSWD[$i]}" | mysql -u $MYSQL_LOGIN_USER -p$MYSQL_LOGIN_PASSWORD
done
请注意,此脚本还存在其他问题:
$(printf %q "$variable")
来允许任何外部变量中的特殊字符。您可以将SQL作为参数而不是标准输入传递:
mysql -u $(printf %q "$MYSQL_LOGIN_USER") -p$(printf %q "$MYSQL_LOGIN_PASSWORD") "CREATE USER $(printf %q "${MYSQL_USERS[$i]}")"
declare -a
- Bash会自动显示出来。答案 1 :(得分:1)
不,如果你得到参数的计数而不是参数本身,你可以在循环中直接访问另一个数组。
像这样:
source var.sh
echo "create database $MYSQL_DATABASE" | mysql -u $MYSQL_LOGIN_USER -p$MYSQL_LOGIN_PASSWORD
for i in "${#MYSQL_USERS[@]}"
do
echo "CREATE USER $MYSQL_USERS" | mysql -u $MYSQL_LOGIN_USER -p$MYSQL_LOGIN_PASSWORD
echo "GRANT ALL PRIVILEGES ON $MYSQL_DATABASE.* TO $MYSQL_USERS IDENTIFIED BY $MYSQL_PASSWD" | mysql -u $MYSQL_LOGIN_USER -p$MYSQL_LOGIN_PASSWORD
done
希望这会有所帮助。如果这回答了您的问题,请标记为正确答案。