2

我想用以下内容替换查​​询中的一些字符串:

URL="sub.domain.tld" mysql -A --user=username --password="password" --host=hostname usernameuction -e "update core_config_data SET value = 'http://${URL}/' WHERE path LIKE 'web/unsecure/base_url'; update core_config_data SET value = 'https://${URL}/' WHERE path LIKE 'web/secure/base_url';"

这几乎可以完美地工作,除了我必须向它添加一个导出才能使其工作:

export URL="sub.domain.tld"; mysql -A --user=username --password="password" --host=hostname usernameuction -e "update core_config_data SET value = 'http://${URL}/' WHERE path LIKE 'web/unsecure/base_url'; update core_config_data SET value = 'https://${URL}/' WHERE path LIKE 'web/secure/base_url';"

如何在不导出的情况下完成这项工作,同时将 var 与 bash 或 zsh 中引用的命令保持在同一行?

4

2 回答 2

2

您可以使用unset从您的环境中删除导出的名称。像这样:

export URL=sub.domain.tld; mysql ...; unset URL

$ export FOO=bar; echo $FOO; unset FOO
bar
$ echo $FOO

此外,您可以在子外壳中执行一个衬里:

$ (export FOO=bar; echo $FOO)
bar
$ echo $FOO

您正在寻找的是类似于执行命令时的行为。像这样:

/* foo.c */
main (void)
{ printf ("FOO: %s\n", getenv("FOO")); }

$ FOO=bar ./foo
FOO: bar

foo使用 FOO 扩展了调用的环境。export但是,在您的情况下,在处理您的 mysql 参数时,环境没有扩展,缺少 using 。您可以使用 shell 函数:

$ foo () { echo "FOO: ${FOO}"; }
$ FOO=baz foo
FOO: baz
$ echo $FOO
于 2013-04-14T13:40:52.283 回答
2

丢失, 但在变量定义和命令export之间保留分号:mysql

URL="sub.domain.tld"; mysql -A --user=username --password="password" --host=hostname usernameuction -e "update core_config_data SET value = 'http://${URL}/' WHERE path LIKE 'web/unsecure/base_url'; update core_config_data SET value = 'https://${URL}/' WHERE path LIKE 'web/secure/base_url';"

说明:当您将变量定义作为单独的命令(例如URL="sub.domain.tld"; mysql ...)时,该变量在 shell 中定义并在mysql ...解析所有后续命令(如 )时应用,但不会导出到这些命令的环境。这就是你想要的。

当您导出一个变量(例如export URL="sub.domain.tld"; mysql ...)时,该变量在 shell 中定义并在解析后续命令时应用,并被导出到这些命令的环境中。

当您将变量定义作为命令的前缀(例如URL="sub.domain.tld" mysql ...)时,它根本不会在 shell 中设置变量,而是将其导出到该命令的环境。这根本不适用于您的情况,因为 to 的参数mysql ... "... https://${URL}/ ..."由 shell 扩展,而不是由mysql,您需要在 shell 中定义的变量,而不是在mysql' 环境中。

于 2013-04-14T17:11:43.093 回答