bash - awk是否支持动态用户定义变量?

标签 bash dynamic awk

awk支持此功能:

awk '{print $(NF-1);}'

但不适用于用户定义的变量:
awk '{a=123; b="a"; print $($b);}'

顺便说一句,shell支持此功能:
a=123;
b="a";
eval echo \${$b};

如何在awk中实现我的目标?

最佳答案

现在不行。但是,如果提供包装器,则可能(有些破旧和肮脏)。
这个想法是使用@运算符,它是在最新版本的gawk中引入的。

此@运算符通常用于按名称调用函数。
所以如果你有

function foo(s){print "Called foo "s}
function bar(s){print "Called bar "s}
{
    var = "";
    if(today_i_feel_like_calling_foo){
        var = "foo";
    }else{
        var = "bar";
    }
    @var( "arg" ); # This calls function foo(), or function bar() with "arg"
}

现在,这本身就很有用。
假设我们事先知道var名称,我们可以编写一个包装器来间接修改和获取vars
function get(varname, this, call){call="get_"varname;return @call();}
function set(varname, arg, this, call){call="set_"varname; @call(arg);}

因此,现在,对于要按名称进行访问的每个var名称,都需要声明这两个函数
function get_my_var(){return my_var;}
function set_my_var(arg){my_var = arg;}

或许,在您的BEGIN {}区块中的某个地方,
BEGIN{ my_var = ""; }

声明它以供全局访问。
那你可以用
get("my_var");
set("my_var", "whatever");

乍一看可能没什么用,但是有一些很好的用例,例如
通过将var的名称保存在另一个var的数组中等方法来保留var的链接列表。
它也适用于数组,说实话,我用它来嵌套和链接数组
数组,因此我可以像使用指针一样遍历多个数组。

您还可以通过以下方式编写在awk中引用var名称的配置脚本,
实际上,在解释器内部也有解释器类型的东西...

这并不是最好的做事方式,但是它可以完成工作,而且我不必担心
空指针异常或GC等:-)

关于bash - awk是否支持动态用户定义变量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11880654/

相关文章:

bash - 将数字添加到文件中每一行的开头

linux - 如果可用大小超过阈值,从目录中递归删除最旧文件的 Bash 脚本

php - 使用 PHP 动态更改链接点击上的 <div> 内容?

javascript - 链接到每天都会变化的 URL?

linux - 使用非 GNU awk 保存修改

bash - 如何在awk中打​​印变量

linux - 根据参数将 bash 中的命令替换为其他命令

linux - Linux Bash 脚本可以响应安装选项吗

dynamic - 是否可以使用动态运算符创建动态算术表达式?

bash - AWK 转义字符困惑