我在使用反引号使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
为什么使用变量执行命令的第一个反引号实际上并不执行完整命令,而只返回第一个命令的输出和第二个命令?我错过了一些东西,以便获得第一个反复执行命令?
答案 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正在做什么