【问题标题】:Extracting a string in csh在 csh 中提取字符串
【发布时间】: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)}'

谢谢 最好的问候

【问题讨论】:

    标签: linux string shell csh


    【解决方案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 将字符串参数按原样传递给程序。 引号告诉 shell 在将参数传递给程序之前对其执行变量扩展。这是一个基本的 shell 功能,在 shell 和一些编程语言(例如 perl)中很常见。

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

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

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

    【讨论】:

      【解决方案2】:

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

      【讨论】:

      • 顺便说一句 - 这实际上是一个比我提出的更好的选择,因为它完全避免了 shell 引用头痛 =)
      猜你喜欢
      • 2011-12-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-03
      相关资源
      最近更新 更多