加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-15 22:18:27 所属栏目:安全 来源:网络整理
导读:awk支持这个: awk '{print $(NF-1);}' 但不适用于用户定义的变量: awk '{a=123; b="a"; print $($b);}' 顺便说一下,shell支持这个: a=123;b="a";eval echo ${$b}; 如何在awk中实现我的目的? 解决方法 现在不行.但是,如果你提供一个包装器,它可能(有点ha
awk支持这个:

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

但不适用于用户定义的变量:

awk '{a=123; b="a"; print $($b);}'

顺便说一下,shell支持这个:

a=123;
b="a";
eval echo ${$b};

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

解决方法

现在不行.但是,如果你提供一个包装器,它可能(有点hacky和脏).
这个想法是使用最近版本的gawk中引入的@ operator.

这个@运算符通常用于按名称调用函数.
所以,如果你有

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名称,我们可以编写一个包装器来间接修改和获取变量

function get(varname,this,call){call="get_"varname;return @call();}
function set(varname,arg,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的数组中来保持变量的链表,等等.
它也适用于数组,说实话,我用它来嵌套和链接数组
数组,所以我可以像使用指针一样遍历多个数组.

您也可以编写以awk方式引用var名称的配置脚本,
实际上有一个解释器 – 解释器类型的东西,也……

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读