13

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?

4
  • 3
    Backticks are horribly outdated and should not be used any more -- using $() instead will save you many headaches Commented Oct 13, 2010 at 19:13
  • 4
    Please see BashFAQ/050 (don't put commands in variables) and BashFAQ/048 (avoid using eval). Also, your shebang says "#!/bin/sh" and your prompt says "sh", but your question tag says [bash] which is not the same thing. Commented Oct 13, 2010 at 19:28
  • I didn't set the bash tag, another user changed that after I posted this. Commented Oct 13, 2010 at 20:45
  • 1
    POSIX sh supports $(). There is no excuse. Commented Oct 13, 2010 at 21:18

4 Answers 4

16

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.

Sign up to request clarification or add additional context in comments.

Comments

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

Comments

0

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.

Comments

0

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

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.