Seu shell está interpretando as aspas, ambas '
e "
antes mesmo que elas cheguem echo
. Geralmente, coloco aspas duplas em volta do meu argumento para ecoar, mesmo que desnecessárias; por exemplo:
$ echo "Hello world"
Hello world
Portanto, no seu primeiro exemplo, se você deseja incluir aspas literais em sua saída, elas precisam ser escapadas:
$ echo \'Hello world\'
'Hello world'
Ou eles já devem ser usados dentro de um argumento citado (mas não pode ser o mesmo tipo de citação, ou você precisará escapar de qualquer maneira):
$ echo "'Hello world'"
'Hello world'
$ echo '"Hello world"'
"Hello world"
No seu segundo exemplo, você está executando uma substituição de comando no meio da string:
grep $ARG /var/tmp/setfile | awk {print $2}
As coisas que começam com $
também são tratadas especialmente pelo shell - as tratam como variáveis e as substituem por seus valores. Como provavelmente nenhuma dessas variáveis está definida no seu shell, na verdade, apenas executa
grep /var/tmp/setfile | awk {print}
Como grep
apenas vê um argumento, ele assume que o argumento é o padrão que você está procurando e que o local em que ele deve ler os dados é stdin, impedindo a entrada de informações. É por isso que seu segundo comando parece travar.
Isso não acontecerá se você citar o argumento (e é por isso que seu primeiro exemplo quase funcionou), portanto, essa é uma maneira de obter a saída desejada:
echo \'' echo PARAM=` grep $ARG /var/tmp/setfile | awk '{print $2}' ` '\'
Você também pode citá-lo duas vezes, mas precisará escapar de $
s para que o shell não os resolva como variáveis e os backticks para que o shell não execute a substituição de comando imediatamente:
echo "' echo PARAM=\` grep \$ARG /var/tmp/setfile | awk '{print \$2}' \` '"