Problem with backticks in shellscript

2019-02-16 20:48发布

问题:

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?

回答1:

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.



回答2:

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


回答3:

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.



回答4:

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