Bash 비대화형 mysql 데이터베이스 생성 문제

Bash 비대화형 mysql 데이터베이스 생성 문제

비대화형 Mysql 데이터베이스 생성 프로세스 중에 진행률 표시줄을 표시하기 위해 대화 상자를 활용하는 bash 스크립트가 있습니다.

시스템 운영 체제: Ubuntu 20.04 서버
Mariadb: 10.5

질문:
첫 번째 Mysql 명령(예: 데이터베이스 생성)만 실행되고, 다른 명령인 경우 을 실행합니다 Error 1064.

#!/usr/bin/env bash
export NCURSES_NO_UTF8_ACS=1
var_db() {
    pfx=$(shuf -zer -n2 {a..z} | tr -d '\0')
    vnum=$(shuf -i 8-11 -n 1)
    sfx=$(openssl rand -base64 32 | tr -d /=+ | cut -c -"$vnum")
    varnam="${pfx}_${sfx}"
    echo "$varnam"
}
site_db() {
    dbname=$(var_db)
    userdb=$(var_db)
    vnum=$(shuf -i 12-15 -n 1)
    passdb=$(openssl rand -base64 32 | tr -d /=+ | cut -c -"$vnum")
    msgs=('Database created'
    'Database user created'
    'All privileges granted on database to user'
    'Reload privilege tables'
    'Restart Mariadb'
    'Reload Mariadb'
        )
    commands=('sudo mysql -e "CREATE DATABASE ${dbname};"'
    'sudo mysql -e "CREATE USER ${userdb}@localhost IDENTIFIED BY '${passdb}';"'
    'sudo mysql -e "GRANT ALL PRIVILEGES ON ${dbname}.* TO '${userdb}'@'localhost';"'
    'sudo mysql -e "FLUSH PRIVILEGES;"'
    'sudo systemctl restart mariadb'
    'sudo systemctl reload mariadb'
            )
    n=${#commands[@]}
    i=0
    while [ "$i" -le "$n" ]; do
        pct=$(( i * 100 / n )) # calculating progress percentage
        if [ $pct -eq 100 ]; then
            echo -e "XXX\n100\nMariadb secure installation completed!\nXXX"
        else
            echo -e "XXX\n$i\n${msgs[i]}\nXXX"
        fi
        echo "$pct"
        eval "${commands[i]}" > /dev/null 2>&1 #eval the output of the commands, 
        i=$((i + 1))
        sleep 2
    done | dialog --keep-tite --title "Site database configuration" --gauge "Site database created" 20 100 0
}
site_db

그러나 배열 내부에서 명령을 사용하지 않으면 모든 mysql 명령이 아래 스크립트에서 실행됩니다. 그렇다면 위 스크립트에서 오류 1064가 발생하는 이유는 무엇입니까?

#!/usr/bin/env bash
var_db() {
    pfx=$(shuf -zer -n2 {a..z} | tr -d '\0')
    vnum=$(shuf -i 8-11 -n 1)
    sfx=$(openssl rand -base64 32 | tr -d /=+ | cut -c -"$vnum")
    varnam="${pfx}_${sfx}"
    echo "$varnam"
}
site_db() {
    dbname=$(var_db)
    userdb=$(var_db)
    vnum=$(shuf -i 12-15 -n 1)
    passdb=$(openssl rand -base64 32 | tr -d /=+ | cut -c -"$vnum")
    sudo mysql -e "CREATE DATABASE ${dbname};"
    sudo mysql -e "CREATE USER ${userdb}@localhost IDENTIFIED BY '${passdb}';"
    sudo mysql -e "GRANT ALL PRIVILEGES ON ${dbname}.* TO '${userdb}'@'localhost';"
    sudo mysql -e "FLUSH PRIVILEGES;"
    sudo systemctl restart mariadb
            )
}
site_db

답변1

이 질문은 배열과 관련이 없습니다.

userdb=userdb_value
passdb=passdb_value
set -x

eval echo 'sudo mysql -e "CREATE USER ${userdb}@localhost IDENTIFIED BY '${passdb}';"'
+ eval echo 'sudo mysql -e "CREATE USER ${userdb}@localhost IDENTIFIED BY passdb_value;"'
++ echo sudo mysql -e 'CREATE USER userdb_value@localhost IDENTIFIED BY passdb_value;'
sudo mysql -e CREATE USER userdb_value@localhost IDENTIFIED BY passdb_value;

echo sudo mysql -e "CREATE USER ${userdb}@localhost IDENTIFIED BY '${passdb}';"
+ echo sudo mysql -e 'CREATE USER userdb_value@localhost IDENTIFIED BY '\''passdb_value'\'';'
sudo mysql -e CREATE USER userdb_value@localhost IDENTIFIED BY 'passdb_value';

대신 SQL을 사용할 수 있는 경우 "다음을 수행할 수 있습니다.'

'sudo mysql -e "CREATE USER ${userdb}@localhost IDENTIFIED BY \"${passdb}\";"'

그렇지 않다면 이렇게 할 수 있습니다

'sudo mysql -e "CREATE USER ${userdb}@localhost IDENTIFIED BY '\''${passdb}'\'';"'

또는

"sudo mysql -e \"CREATE USER ${userdb}@localhost IDENTIFIED BY '${passdb}';\""

또는

quote=\'
'sudo mysql -e "CREATE USER ${userdb}@localhost IDENTIFIED BY ${quote}${passdb}${quote};"'

관련 정보