命令行參数的一个重要限制是它们在BEGIN过程中是不可用的。

也就是说,直到首行输入完毕以后它们才可用。为什么?这是一个easy混乱的部分。从命令行传递的參数就好像文件名称一样被处理。赋值操作知道这个变量(假设它是一个文件名称)被求值时才进行。

參阅以下的脚本,该脚本将变量n设置为一个命令行參数。

awk ' BEGIN { print n }

if (n == 1) print "Reading the first file"

if (n == 2) print "Reading the second file"

}' n=1 test
n=2 test2

这里有4个命令行參数: "n=1 "、"test" 、"n=2 "和"test2"。假设你如今还记着BEGIN过程即"在处理输入之前所要做的",你将会理解为什么在BEGIN过程中的參数n返回值为空,因此print语句将打印一个空行。

假设第一个參数是一个文件而不是一个变量赋值。该文件会知道BEGIN过程运行后才被打开。

第一个參数为变量n赋初值1 ,第二个參数提供了文件名称。因此,对于test中的每一行。条件"n==1 "都为真。在读完test中的全部行之后,计算第三个參数,并将n赋值为2 。最后。第四个參数提供了第二个文件名称。这时在主过程中的条件"n==2"为真。

以这样的方法对參数求值的后果是不能用BEGIN过程測试或检验命令行提供的參数。

仅仅有当输入一行后它们才可以使用。要了解这样的局限性,可以通过编写规则"NR==1"并使用它的过程来检验參数的赋值。

还有一个方法是在调用awk之前在shell脚本中測试命令行參数。

POSIX awk提供了一个解决问题的方法,即在不论什么输入被读入前定义參数。用-v选项指定要在运行BEGIN 过程之前得到变量赋值(也就是,在读入第一个输入行之前)。-v选项必须在一个命令行脚本前说明。比如:下列命令使用-v选项为多行记录设置记录分隔符。

$ awk -F'\n"
-v RS="" '{ print }'
phones.block

每一个传递给程序的变量赋值都须要一个不同的-v选项。

和C程序语言类似。awk也提供系统变量ARGC和ARGV。

由于这须要了解数组。我们将在第八幸"条件、循环和数组"中讨论这些特点。

最新文章

  1. iOS开发--动画篇之layout动画深入
  2. [原创]Devexpress XtraReports 系列 9 创建邮件合并报表
  3. 【转】python代码风格-PEP8
  4. C与OC、C++的区别
  5. linux tee 命令详解
  6. Android再学习-20141018-布局-进度条
  7. ABP启动配置
  8. 实现点击后创建div,若对div2秒无操作则将div隐藏,鼠标移上div让它不隐藏,移出div超过两秒则div隐藏
  9. Struts2第六篇【文件上传和下载】
  10. Django ModelForm修改默认的控件属性
  11. LTS和其他解决方案的比较(官方)
  12. python报错之OSError
  13. python中不同文件中函数和类的调用
  14. 【Quartz】1、Quartz使用说明
  15. [No0000B1]ReSharper操作指南2/16-ReSharper食谱与特定于域的教程
  16. bzoj千题计划249:bzoj5100: [POI2018]Plan metra
  17. IAR for stm8 memory窗口的功能
  18. 浏览器被hao123,hao524劫持的解决办法
  19. 【android】如何让WebView对Video标签的支持更强力
  20. “Hello World!”团队第七周召开的第一次会议

热门文章

  1. python基础教程_学习笔记12:充电时刻——模块
  2. struts2异常处理
  3. adb 修改手机代理方式
  4. leetcode——Lowest Common Ancestor of a Binary Tree
  5. NFS介绍
  6. spring boot下WebSocket消息推送(转)
  7. Limu:JavaScript的那些书
  8. Tomcat启动时报 java.lang.OutOfMemoryError: Java heap space
  9. 基于libmemcached,php扩展memcached的安装
  10. 根据现有IP地址获取其地理位置(省份,城市等)的方法