在shell脚本中使用反引号出现问题

13

我使用反引号运算符编写的shell脚本出现问题,无法正常工作。以下是我遇到问题的脚本示例:

#!/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

为什么使用变量作为命令的第一个反引号不会执行整个命令,而只返回第一个命令的输出和第二个命令?我需要做些什么才能使第一个反引号执行命令?


3
反引号已经过时了,不应再使用 -- 改用 $() 可以避免很多麻烦。 - Daenyth
4
请参考BashFAQ/050(不要将命令放在变量中)和BashFAQ/048(避免使用eval)。此外,您的shebang说“#!/bin/sh”,您的提示符显示为“sh”,但您的问题标签是[bash],这不是同一件事。 - Dennis Williamson
我没有设置bash标签,是另一个用户在我发布后更改的。 - benw
1
POSIX sh 支持 $()。没有任何借口。 - Daenyth
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,该行将实际被执行


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

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正在做什么。

0
在你的第一个例子中,echo正在解析参数 - shell从未看到它们。在第二个例子中,它可以工作是因为shell正在解析并知道如何使用管道。如果你将ECHO_CMD更改为"bash echo ...",它就会工作。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接