shell脚本中的反引号问题

时间:2010-10-13 19:00:51

标签: shell backticks

我在使用反引号使shellcript工作时遇到问题。以下是我遇到问题的脚本的示例版本:

#!/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 个答案:

答案 0 :(得分:13)

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

result=`eval ${ECHO_CMD}`;

取代

result=`${ECHO_CMD}`;

没有eval

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

将扩展为

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

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

答案 1 :(得分: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"

看一下doc:

help eval

答案 2 :(得分:0)

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

答案 3 :(得分: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;

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