Проблема с обратными галочками в шеллскрипте - PullRequest
8 голосов
/ 13 октября 2010

У меня проблема с тем, чтобы мой шеллскрипт работал с использованием обратных кавычек.Вот пример версии сценария, с которым у меня возникла проблема:

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

13 голосов
/ 13 октября 2010

Вам нужно использовать eval, чтобы заставить его работать

result=`eval ${ECHO_CMD}`;

вместо

result=`${ECHO_CMD}`;

Без eval

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

, что будетбудет расширен до

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

, будет рассматриваться как аргумент echo и будет выводиться дословно.С eval эта строка на самом деле будет run .

2 голосов
/ 13 октября 2010

тебе привет,

вам нужно знать 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 голосов
/ 13 октября 2010

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

0 голосов
/ 13 октября 2010

В вашем первом примере echo анализирует параметры - оболочка их никогда не видит.Во втором примере это работает, потому что оболочка выполняет разбор и знает, что делать с каналом.Если вы измените ECHO_CMD на "bash echo ...", он будет работать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...