shellscript中的反引号问题
我在使用反引号让 shellscript 工作时遇到问题。这是我遇到问题的脚本的示例版本:
#!/bin/sh
ECHO_TEXT="Echo this"
ECHO_CMD="echo ${ECHO_TEXT} | awk -F' ' '{print \$1}'"
result=`${ECHO_CMD}`;
echo $result;
result=`echo ${ECHO_TEXT} | awk -F' ' '{print \$1}'`;
echo $result;
该脚本的输出是:
sh-3.2$ ./test.sh
Echo this | awk -F' ' '{print $1}'
Echo
为什么使用命令变量的第一个反引号实际上并未执行完整命令,而仅返回第一个命令的输出以及第二个命令?为了获得第一个反引号来执行命令,我遗漏了一些东西?
I am having a problem getting my shellscript working using backticks. Here is an example version of the script I am having an issue with:
#!/bin/sh
ECHO_TEXT="Echo this"
ECHO_CMD="echo ${ECHO_TEXT} | awk -F' ' '{print \$1}'"
result=`${ECHO_CMD}`;
echo $result;
result=`echo ${ECHO_TEXT} | awk -F' ' '{print \$1}'`;
echo $result;
The output of this script is:
sh-3.2$ ./test.sh
Echo this | awk -F' ' '{print $1}'
Echo
Why does the first backtick using a variable for the command not actually execute the full command but only returns the output of the first command along with the second command? I am missing something in order to get the first backtick to execute the command?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
您需要使用
eval
来代替的情况下
没有
eval
工作,它将被扩展为
将被视为
echo
的参数,并且将被逐字输出。使用eval
,该行实际上将运行。You need to use
eval
to get it workingin place of
Without
eval
which will be expanded to
will be treated as argument to
echo
and will be output verbatim. Witheval
that line will actually be run.你好,
你需要了解eval命令。
请参阅:
看看文档:
You Hi,
you need to know eval command.
See :
Take a look to the doc :
在第一个示例中,echo 正在解析参数 - shell 永远不会看到它们。在第二个示例中,它可以工作,因为 shell 正在进行解析并且知道如何处理管道。如果将 ECHO_CMD 更改为“bash echo ...”,它将起作用。
In your first example echo is parsing the parameters - the shell never sees them. In the second example it works because the shell is doing the parsing and knows what to do with a pipe. If you change ECHO_CMD to be "bash echo ..." it will work.
Bash 正在为您转义您的命令。尝试
或者更好的是,尝试在第一行设置 -x ,这样你就可以看到 bash 正在做什么
Bash is escaping your command for you. Try
Or even better, try set -x on the first line, so you see what bash is doing