Bash无法回显嵌入变量的$(hostname)

art*_*ari 2 bash hostname echo

如果我回显一个包含$(hostname)命令的字符串,那么它工作正常.例如,在终端中运行:

echo "http://$(hostname)/main.html"
http://artur/main.html
Run Code Online (Sandbox Code Playgroud)

但是当我尝试使用echo打印时,如果我从一个文件中获取该字符串(以前将cat变为变量),则它不起作用:

$ cat site
http://$(hostname)/main.html
$ mysite=$(cat site)
$ echo $mysite
http://$(hostname)/main.html
Run Code Online (Sandbox Code Playgroud)

我究竟做错了什么?任何的想法?

Joh*_*024 10

shell执行变量扩展,shell执行命令替换,但它不会递归执行:

  1. 一的结果变量扩展进行任何进一步的变量扩展命令替换.

  2. 命令替换的结果将不会受到任何进一步的变量扩展命令替换.

这是一件好事,因为如果它是递归完成的,那么就会出现意想不到的结果和安全问题.

一种解决方案是使用eval.这是一种普遍危险的做法,应被视为最后的手段.

安全的解决方案是重新思考你想要的东西.特别是,您何时需要hostname评估?是否应该在site创建文件之前对其进行评估?或者,是否应该在代码最终运行时进行评估?后者似乎是你想要的.

如果是这种情况,请考虑这种方法.放入您想要主机名称%ssite文件:

$ cat site
http://%s/main.html
Run Code Online (Sandbox Code Playgroud)

阅读site文件时,请使用printf以替换主机名:

$ mysite=$(printf "$(cat site)" "$(hostname)")
$ echo "$mysite"
http://artur/main.html
Run Code Online (Sandbox Code Playgroud)

使用bash,上述表单的替代方法是:

$ printf -v mysite "$(< site)" "$HOSTNAME"
$ echo "$mysite"
http://artur/main.html
Run Code Online (Sandbox Code Playgroud)

  • 在 Bash 中,您(大多数)可以使用变量 `HOSTNAME` 代替命令 `hostname`:`printf -v mysite "$(&lt; site)" "$HOSTNAME"`。 (2认同)