비대화형 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};"'