shellscript中的反引号问题

发布于 2024-09-27 11:46:45 字数 456 浏览 1 评论 0原文

我在使用反引号让 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

旧伤还要旧人安 2024-10-04 11:46:45

您需要使用eval来代替

result=`eval ${ECHO_CMD}`;

的情况下

result=`${ECHO_CMD}`;

没有eval

${ECHO_TEXT} | awk -F' ' '{print \$1}

工作,它将被扩展为

Echo this | awk -F' ' '{print \$1}

将被视为echo的参数,并且将被逐字输出。使用eval,该行实际上将运行

You need to use eval to get it working

result=`eval ${ECHO_CMD}`;

in place of

result=`${ECHO_CMD}`;

Without eval

${ECHO_TEXT} | awk -F' ' '{print \$1}

which will be expanded to

Echo this | awk -F' ' '{print \$1}

will be treated as argument to echo and will be output verbatim. With eval that line will actually be run.

子栖 2024-10-04 11:46:45

你好,

你需要了解eval命令。

请参阅:

#!/bin/sh

ECHO_TEXT="Echo this"
ECHO_CMD="echo ${ECHO_TEXT} | awk -F' ' '{print \$1}'"

result="`eval ${ECHO_CMD}`"
echo "$result"

result="`echo ${ECHO_TEXT} | awk -F' ' '{print $1}'`"
echo "$result"

看看文档:

help eval

You Hi,

you need to know eval command.

See :

#!/bin/sh

ECHO_TEXT="Echo this"
ECHO_CMD="echo ${ECHO_TEXT} | awk -F' ' '{print \$1}'"

result="`eval ${ECHO_CMD}`"
echo "$result"

result="`echo ${ECHO_TEXT} | awk -F' ' '{print $1}'`"
echo "$result"

Take a look to the doc :

help eval
再见回来 2024-10-04 11:46:45

在第一个示例中,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.

北笙凉宸 2024-10-04 11:46:45

Bash 正在为您转义您的命令。尝试

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;

或者更好的是,尝试在第一行设置 -x ,这样你就可以看到 bash 正在做什么

Bash is escaping your command for you. Try

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;

Or even better, try set -x on the first line, so you see what bash is doing

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文