繁体   English   中英

为什么我需要在开始块中初始化变量

[英]why do I need to initialize variable in begin block

我已经运行了以下代码:

awk 'BEGIN{ color["one"]="red"; color["two"]="orange";print color["one"] }'

并得到

red

但是,当我执行以下两个代码时:

awk 'BEGIN{ color["one"]="red"; color["two"]="orange"}{print color["one"] }'

awk '{ color["one"]="red"; color["two"]="orange";print color["one"] }'

执行似乎不起作用。 为什么我不能将color["one"]放在 body 块中作为第一个不工作的代码? 另外,为什么我必须放color["one"]="red"; color["two"]="orange";print color["one"] color["one"]="red"; color["two"]="orange";print color["one"]在 begin 块中color["one"]="red"; color["two"]="orange";print color["one"] 谢谢你。

是的,这是正常现象,因为BEGIN在部分awk读取INPUT_FILE所以它并不需要你这边过任何INPUT_FILE名的1日前执行awk作品。 但是在您的另一个awk关闭BEGIN部分,然后通过{...}打开了一个主块,因此它需要一个 Input_file 来执行它。

man awk页面也可以看到以下内容:

BEGIN 和 END 是两种特殊的模式,它们不针对输入进行测试。 所有 BEGIN 模式的动作部分都被合并,就好像所有语句都写在单个 BEGIN 块中一样。 它们在读取任何输入之前执行。 类似地,所有 END 块都被合并,并在所有输入都用完时(或在执行 exit 语句时)执行。 BEGIN 和 END 模式不能与模式表达式中的其他模式组合。 BEGIN 和 END 模式不能缺少动作部分。

你的第一个awk

awk 'BEGIN{ color["one"]="red"; color["two"]="orange";print color["one"] }'

BEGIN部分之后没有给出任何语句,所以它按预期工作并给出red作为输出。



你的第二个awk :让我们把它分成两部分

第一部分(理解):

awk 'BEGIN{ color["one"]="red"; color["two"]="orange"}

第二部分(理解):

{print color["one"] }'

所以第一部分是BEGIN部分,第二部分是主块,它期望将 Input_file 传递给awk程序。

回答为什么在BEGIN部分初始化变量或数组对于您的问题,为什么必须在BEGIN块中初始化变量或数组是因为在读取 Input_file 时BEGIN部分在主块之前执行,因此最好对所有变量进行初始化和数组,以避免它们重新启动或使用条件启动它们(每次读取每行时都会检查)。 这就是为什么建议恕我直言在BEGIN部分初始化它们。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM