代码之家  ›  专栏  ›  技术社区  ›  digitalbyte

awk shell变量不工作

ksh
  •  1
  • digitalbyte  · 技术社区  · 10 年前

    嗨,我使用的是GNU awk 3.1.5版,我在KSH脚本中指定了2个变量

    PKNAME= ls -lt /var/db/pkg | tr -s " " | cut -d" " -f9
    PKDATE= ls -lt /var/db/pkg/$PKNAME/ | tr -s " " | cut -d" " -f6-8
    

    我试图通过使用运行测试来证明我得到了正确的输出

    echo bar    
    awk -F, -v pkname="$PKNAME" -v pkdate="$PKDATE" 'BEGIN{print pkname, pkdate, "foo"; exit}'
    echo baz
    

    这样的输出结果是2个空格和foo,如下所示

    bar
      foo
    baz
    

    我试过,双引号,单引号和反勾号。还尝试了带反勾号的双引号。

    你知道为什么变量没有被执行吗?我对awk相当陌生,感谢任何帮助!谢谢

    我认为有可能不可能在awk语句中运行子shell命令。这是真的吗?

    1 回复  |  直到 10 年前
        1
  •  1
  •   Tom Fenech    10 年前

    这与awk无关。问题在于你分配变量的方式。你的台词应该是这样的:

    PKNAME=$(ls -lt /var/db/pkg | tr -s " " | cut -d" " -f9)
    

    可能有 没有空格 围绕shell中赋值的任一侧。

    目前,您正在运行命令 ls -lt ... 带有变量 PKNAME 临时分配给空字符串。在后续命令中,变量保持未设置。

    awk命令应保持不变,即shell变量应按如下方式传递 -v pkname="$PKNAME" 顺便说一句,通常认为使用大写变量名是不好的做法,因为这些变量名应该保留给shell内部使用。