source

mysql 명령에서 bash에 선언된 변수를 가장 잘 사용하려면 어떻게 해야 합니까?

manysource 2023. 8. 13. 09:49

mysql 명령에서 bash에 선언된 변수를 가장 잘 사용하려면 어떻게 해야 합니까?

시스템 자동 설치 및 구성을 위해 bash 스크립트를 작성하고 있으며 스크립트에서 선언된 변수에서 mysql의 루트 암호를 설정할 수 있어야 하는데 작동하지 않습니다.

read -p "Password `echo $'\n> '`" mysql_passwd

mysql --defaults-file=/etc/mysql/debian.cnf mysql -Bse 'UPDATE user SET password=PASSWORD("$mysql_passwd") WHERE User="root";flush privileges;'

변수(암호만 직접 포함) 없이 스크립트에서 명령을 실행하면 다음과 같이 작동합니다.

mysql --defaults-file=/etc/mysql/debian.cnf mysql -Bse 'UPDATE user SET password=PASSWORD("password") WHERE User="root";flush privileges;'

다음과 같은 시도:

PASSWORD("$mysql_passwd") 

PASSWORD("${mysql_passwd}")

PASSWORD('$mysql_passwd')

오류 메시지는 없습니다. 루트 암호가 변경되지 않습니다.

읽어주셔서 감사합니다.

당신은 인용문을 반대로 써야 합니다.처음에는 큰따옴표, 다음에는 작은따옴표:

mysql --defaults-file=/etc/mysql/debian.cnf mysql -Bse "UPDATE user SET password=PASSWORD('$mysql_passwd') WHERE User='root';flush privileges;"

따옴표가 하나 있는 항목을 이스케이프하면 변수 이름이 확인되지 않습니다.

차이점은 다음과 같습니다.

# a=asdf
#
# echo "'$a'"
'asdf'
# echo '"$a"'
"$a"

SQL 문은 따옴표로 묶인 단일 문자열로 구성합니다.

'UPDATE user SET password=PASSWORD("$mysql_passwd") WHERE User="root";flush privileges;'

Bash는 변수 이름만 바꿉니다($mysql_passwd) 맨몸이거나 이중 가닥 문자열에 있을 때.따옴표로 묶인 단일 문자열에서 문자 그대로 "$myql_passwd"로 처리됩니다.예:

mysql_passwd="abcdef"
echo $mysql_passwd  # prints abcdef
echo "$mysql_passwd"  # prints abcdef
echo '$mysql_passwd'  # prints $mysql_passwd

따라서 단일 따옴표를 큰따옴표로 교환하고 기존의 큰따옴표에서 벗어나야 합니다.

"UPDATE user SET password=PASSWORD(\"$mysql_passwd\") WHERE User=\"root\";flush privileges;"

또는 단일 따옴표로 묶은 문자열을 종료하거나 다음을 사용하여 이중 따옴표로 묶은 문자열을 추가합니다.$mysql_passwd그런 다음 나머지 쿼리를 다른 단일 쿼리 문자열에서 수행합니다(이와 같이 서로 옆에 있는 문자열을 연결합니다).

'UPDATE user SET password=PASSWORD("'"$mysql_passwd"'") WHERE User="root";flush privileges;'

언급URL : https://stackoverflow.com/questions/54342628/how-do-i-best-use-a-declared-variable-in-bash-in-mysql-command