Ваша оболочка интерпретирует кавычки, '
и "
прежде, чем они до них дойдут echo
. Я обычно просто помещаю двойные кавычки вокруг моего аргумента, чтобы повторить, даже если они не нужны; например:
$ echo "Hello world"
Hello world
Итак, в первом примере, если вы хотите включить в вывод вывод буквенных кавычек, их нужно либо экранировать:
$ echo \'Hello world\'
'Hello world'
Или они уже должны использоваться внутри аргумента в кавычках (но это не может быть тот же тип цитаты, или вам все равно придется избегать его):
$ echo "'Hello world'"
'Hello world'
$ echo '"Hello world"'
"Hello world"
Во втором примере вы выполняете подстановку команд в середине строки:
grep $ARG /var/tmp/setfile | awk {print $2}
Вещи, которые начинаются с $
, также обрабатываются специально оболочкой - она обрабатывает их как переменные и заменяет их значениями. Поскольку, скорее всего, ни одна из этих переменных не установлена в вашей оболочке, она просто запускается
grep /var/tmp/setfile | awk {print}
Поскольку он grep
видит только один аргумент, он предполагает, что аргумент - это шаблон, который вы ищете, и что место, из которого он должен читать данные, - это stdin, поэтому он блокирует ожидание ввода. Вот почему ваша вторая команда, кажется, просто зависает.
Этого не произойдет, если вы заключите аргумент в одинарные кавычки (именно поэтому ваш первый пример почти сработал), так что это один из способов получить желаемый результат:
echo \'' echo PARAM=` grep $ARG /var/tmp/setfile | awk '{print $2}' ` '\'
Вы также можете заключить его в двойные кавычки, но тогда вам нужно будет экранировать $
s, чтобы оболочка не преобразовывала их как переменные, и обратные галочки, чтобы оболочка не запускала подстановку команд сразу:
echo "' echo PARAM=\` grep \$ARG /var/tmp/setfile | awk '{print \$2}' \` '"