1

我有一个关于 Shell 变量替换的问题。

要求: 我需要向 mysql db 插入一些东西。而且我不想在 main shell 中编写插入脚本,所以我想将插入 sql 脚本定义为变量 $SQL 。此变量和许多其他变量存储在另一个名为 sql.cfg 的文件中

但是这个变量将引用另一个变量 $Value。当我执行主 shell 时,$Value 将被实际值替换。</p>

示例: 在 sql.cfg 中

SQL="insert into table column1,column2 values($Value1,$Value2)"
DB_NAME=dbname
DB_IP=192.168.0.x
USR=username
PWD=password

在 main.sh

. ./sql.cfg

Value1=100
Value2=200

` mysql $DB_NAME -h$DB_IP -u $USR -p$PWD -se "$SQL;"`

问题:

如何正确地将 $sql 替换为 $Value1 $Value2 以便我可以将它们插入到 mysql db 中?

非常感谢!!!

4

1 回答 1

1

在加载/获取 sql.cfg 之前Value1,您必须在 main.sh 中设置Value2

例子:

kent$  head *           
==> main.sh <==
#!/bin/bash
Value1=100
Value2=200
source sql.cfg
echo "$DB_NAME - $SQL"



==> sql.cfg <==
#!/bin/bash
SQL="insert into table column1,column2 values($Value1,$Value2)"
DB_NAME=dbname
DB_IP=192.168.0.x
USR=username
PWD=password

kent$  ./main.sh
dbname - insert into table column1,column2 values(100,200)

如果您真的想先加载 sql.cfg 并稍后在 main.sh 中设置值。您可以将 sql.cfg 中的 $Value1,2 更改为占位符,并在 main.sh 中根据需要替换这些值。请参阅示例:

kent$  head *
==> main.sh <==
#!/bin/bash
source sql.cfg

Value1=444
Value2=555

SQL=$(sed "s/:Value1/$Value1/g; s/:Value2/$Value2/g" <<<$SQL)

echo "$DB_NAME - $SQL"


==> sql.cfg <==
#!/bin/bash
SQL="insert into table column1,column2 values(:Value1,:Value2)"
DB_NAME=dbname

kent$  ./main.sh
dbname - insert into table column1,column2 values(444,555)
于 2013-01-28T11:04:46.350 回答