您的shell会在甚至到达之前解释引号('
和)。我通常只是在引号周围加上双引号,以使它们回声,即使它们是不必要的也是如此。例如:"
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}
开头$
的内容也由shell专门处理-将它们视为变量并将其替换为它们的值。由于最有可能在您的外壳中未设置这些变量,因此实际上它只是在运行
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}' \` '"