在bash中将变量传递给SQL脚本

时间:2014-11-13 11:32:33

标签: bash

我目前正在用bash编写一个脚本,该脚本使用SQL文件运行一些查询来设置数据库和表结构。

我需要将一些用户输入的数据传递给脚本,但是已经碰壁了。 这是我用来运行SQL脚本的行:

mysql --user="root" --password="$mysql_password" --execute "SET @domain=${domain}" < mailserver-databases.sql

'mailserver-database.sql'文件中需要传递给它的变量的命令之一是:

INSERT INTO `servermail`.`virtual_domains`(`id` ,`name`)VALUES('1', '@domain');

'@ domain'将是用户输入的值 - 'domain'是通过以下命令设置的:

echo -n 'Please enter the domain you wish to use > '
read domain

当我为域输入'test.com'时,会返回以下错误:

ERROR 1109 (42S02) at line 1: Unknown table 'test' in field list

所以看起来变量正在传递给脚本,但我假设我的脚本中某处存在语法错误

这是SQL文件输出:

DROP DATABASE IF EXISTS servermail;
CREATE DATABASE servermail;
GRANT SELECT ON servermail.* TO 'usermail'@'127.0.0.1' IDENTIFIED BY 'mailpassword';
FLUSH PRIVILEGES;
USE servermail;
CREATE TABLE `virtual_domains` (`id`  INT NOT NULL AUTO_INCREMENT,`name` VARCHAR(50) NOT NULL,PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `virtual_users` (`id` INT NOT NULL AUTO_INCREMENT,`domain_id` INT NOT NULL,`password` VARCHAR(106) NOT NULL,`email` VARCHAR(120) NOT NULL,PRIMARY KEY (`id`),UNIQUE KEY `email` (`email`),FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE) ENGINE=InnoDB DEFAULT CHARSET=utf8;
CREATE TABLE `virtual_aliases` (`id` INT NOT NULL AUTO_INCREMENT,`domain_id` INT NOT NULL,`source` varchar(100) NOT NULL,`destination` varchar(100) NOT NULL,PRIMARY KEY (`id`),FOREIGN KEY (domain_id) REFERENCES virtual_domains(id) ON DELETE CASCADE) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `servermail`.`virtual_domains`(`id` ,`name`)VALUES('1', '@domain');

1 个答案:

答案 0 :(得分:1)

我不认为如果您使用-e|--execute执行命令,它也会执行发送到标准输入的命令。

你可以像这样将它们结合在一起:

echo -n 'Please enter the domain you wish to use > '
read domain

{
  echo "SET @domain='${domain}';";
  cat mailserver-databases.sql;
} | mysql --user="root" --password="$mysql_password"

此外,如果您想使用变量的值,请不要将变量包装在引号中:

INSERT INTO `servermail`.`virtual_domains`(`id` ,`name`) VALUES ('1', @domain);