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执行命令替换,但它不会递归执行:
一的结果变量扩展将不进行任何进一步的变量扩展或命令替换.
命令替换的结果将不会受到任何进一步的变量扩展或命令替换.
这是一件好事,因为如果它是递归完成的,那么就会出现意想不到的结果和安全问题.
一种解决方案是使用eval.这是一种普遍危险的做法,应被视为最后的手段.
安全的解决方案是重新思考你想要的东西.特别是,您何时需要hostname评估?是否应该在site创建文件之前对其进行评估?或者,是否应该在代码最终运行时进行评估?后者似乎是你想要的.
如果是这种情况,请考虑这种方法.放入您想要主机名称%s的site文件:
$ 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)