Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Bash Shell变量定义和替换是否在一行中正确引用?_Bash_Zsh - Fatal编程技术网

Bash Shell变量定义和替换是否在一行中正确引用?

Bash Shell变量定义和替换是否在一行中正确引用?,bash,zsh,Bash,Zsh,我想用如下内容替换查询中的一些字符串: 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

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

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中引用的命令保持在同一行?

您可以使用
unset
从环境中删除导出的名称。因此:

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

$ export FOO=bar; echo $FOO; unset FOO
bar
$ echo $FOO
此外,您还可以在子shell中执行一行程序:

$ (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扩展的。但是,在您的情况下,在处理mysql参数时,除了使用
export
,环境没有扩展。您可以使用shell函数:

$ foo () { echo "FOO: ${FOO}"; }
$ FOO=baz foo
FOO: baz
$ echo $FOO

您可以使用
unset
从环境中删除导出的名称。因此:

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

$ export FOO=bar; echo $FOO; unset FOO
bar
$ echo $FOO
此外,您还可以在子shell中执行一行程序:

$ (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扩展的。但是,在您的情况下,在处理mysql参数时,除了使用
export
,环境没有扩展。您可以使用shell函数:

$ foo () { echo "FOO: ${FOO}"; }
$ FOO=baz foo
FOO: baz
$ echo $FOO

丢失
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中设置变量,而是将其导出到该命令的环境中。这根本不适合您的情况,因为
mysql的参数。。。“…https://${URL}/…”
由shell扩展,而不是由
mysql
扩展,您需要在shell中定义变量,而不是在
mysql
的环境中定义变量。

丢失
导出
,但在变量定义和
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中设置变量,而是将其导出到该命令的环境中。这根本不适合您的情况,因为
mysql的参数。。。“…https://${URL}/…”
由shell扩展,而不是通过
mysql
,您需要在shell中定义变量,不在
mysql
的环境中。

使用
export
有什么问题吗?我不喜欢额外的导出变量漂浮在我的shell上,这样我就可以重复使用var,而不用踩到什么东西。将其保留在命令的本地是一个很好的做法。重新检查的答案将变量保留在shell中。尝试
FOO=bar;echo$FOO
然后是
echo$FOO
,因此它不是“本地命令”。使用
export
有什么问题吗?我不喜欢额外的导出变量漂浮在我的外壳上,这样我也可以重复使用var,而不用踩到什么东西。将其保留在命令的本地是一个很好的做法。重新检查的答案将变量保留在shell中。尝试
FOO=bar;echo$FOO
然后是
echo$FOO
,因此它不是“本地命令”。Hrm,是的,谢谢,我已经熟悉了这些,但我问这个更多是出于好奇和风格。为您的业务异常努力。。。给我5公里以上的积分!为了我的光顾,也让我上一点吧!:PHrm,是的,谢谢,我对这些已经很熟悉了,但我问这个更多是出于好奇和风格。为你的生意异常努力。。。给我5公里以上的积分!为了我的光顾,也让我上一点吧!:P