【发布时间】:2012-03-16 12:10:57
【问题描述】:
请您解释一下为什么以下 shell 命令不起作用:
sh-3.1$ echo $MYPATH
/opt/Application/DATA/CROM/my_application
sh-3.1$ awk '{print substr($MYPATH,3)}'
谢谢 最好的问候
【问题讨论】:
请您解释一下为什么以下 shell 命令不起作用:
sh-3.1$ echo $MYPATH
/opt/Application/DATA/CROM/my_application
sh-3.1$ awk '{print substr($MYPATH,3)}'
谢谢 最好的问候
【问题讨论】:
MYPATH 不会被 shell 替换,因为字符串使用单引号。考虑以下几点:
csh$ echo '{print substr($USER,3)}'
{print substr($USER,3)}
csh$ echo "{print substr($USER,3)}"
{print substr(dshawley,3)}
single 引号的使用指示shell 将字符串参数按原样传递给程序。 双 引号告诉 shell 在将参数传递给程序之前对其执行变量扩展。这是一个基本的 shell 功能,在 shell 和一些编程语言(例如 perl)中很常见。
您将遇到的下一个问题是awk 需要在substr 的第一个参数周围加上引号,否则解析将失败。在这种情况下,您可能会看到“非法变量名”警告。这就是我迷失 csh 的地方,因为我不知道如何正确地转义带引号的字符串中的双引号。在 bash/sh/ksh 中,您将执行以下操作:
sh$ awk "{print substr(\"$USER\",3)}"
input
^D
hawley
sh$
如果您还不知道这一点,awk 将需要输入流才能执行任何操作。对于这个小例子,我必须输入“输入”和 EOF 字符。
【讨论】:
"string" is a weak quote. Enclosed whitespace and wildcards are taken as literals, but variable and command substitutions are still performed.
'string' is a strong quote. The entire enclosed string is taken as a literal.
您可以使用-v 选项将变量传递给awk:
awk -v mypath=$MYPATH 'BEGIN{print substr(mypath, 3)}'
【讨论】: