12

我在使用反引号使我的 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

为什么使用命令变量的第一个反引号实际上并未执行完整命令,而仅返回第一个命令的输出以及第二个命令?为了让第一个反引号执行命令,我遗漏了一些东西?

4

4 回答 4

16

您需要使用eval它才能正常工作

result=`eval ${ECHO_CMD}`;

代替

result=`${ECHO_CMD}`;

没有eval

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

这将扩展到

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

将被视为参数echo并将逐字输出。随着eval那条线的实际运行

于 2010-10-13T19:14:18.380 回答
2

你好,

你需要知道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
于 2010-10-13T19:17:10.607 回答
0

在您的第一个示例中, echo 正在解析参数 - 外壳永远不会看到它们。在第二个示例中,它可以工作,因为 shell 正在执行解析并且知道如何处理管道。如果您将 ECHO_CMD 更改为“bash echo ...”,它将起作用。

于 2010-10-13T19:06:37.583 回答
0

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;

或者更好的是,在第一行尝试 set -x,这样你就会看到 bash 在做什么

于 2010-10-13T19:14:33.763 回答