在csh中提取字符串

时间:2012-03-16 12:10:58

标签: linux string shell csh

请您解释为什么以下shell命令不起作用:

sh-3.1$ echo $MYPATH
/opt/Application/DATA/CROM/my_application
sh-3.1$ awk '{print substr($MYPATH,3)}'

由于 最诚挚的问候

2 个答案:

答案 0 :(得分:1)

Quoting and escaping

"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)}'

答案 1 :(得分:1)

由于字符串使用单引号,

MYPATH不会被shell替换。请考虑以下事项:

csh$ echo '{print substr($USER,3)}'
{print substr($USER,3)}
csh$ echo "{print substr($USER,3)}"
{print substr(dshawley,3)}

single 引号的使用指示shell将字符串参数按原样传递给程序。 Double 引用告诉shell在将参数传递给程序之前对参数执行变量扩展。这是shell和一些编程语言(例如perl)中常见的基本shell特性。

您将遇到的下一个问题是awk需要将第一个参数引用到substr,否则解析将失败。在这种情况下,您可能会看到“非法变量名称”警告。这是我迷失csh的地方,因为我不知道如何在引用的字符串中正确地转义双引号。在bash / sh / ksh中,您将执行以下操作:

sh$ awk "{print substr(\"$USER\",3)}"
input
^D
hawley
sh$

如果您还不知道这一点,awk将需要输入流才能执行任何操作。我必须为小例子输入“输入”和EOF字符。