for循环中的逻辑和运算符

时间:2014-07-11 10:11:22

标签: mysql bash shell

我正在编写一个脚本

它将访问一个文件中的所有变量,并将在另一个脚本中使用这些变量

在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循环??

2 个答案:

答案 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]}")"
    
  • Nitpick,但在分配文字时你不需要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

希望这会有所帮助。如果这回答了您的问题,请标记为正确答案。