$ eval $(awk 'BEGIN{ print "str=\"for not\""; print "str2=hello" }' ) $ echo $str for not $ echo $str2 hello |
shell向awk传递变量的方法则比较多,有四种: 1. -v选项; 2. 修改ARGV; 3. shell的导出变量; 4. 将命令写在两对单引号里
1. -v选项
$ awk 'BEGIN{ print var; }' -v var=fornote $ awk -v var=hello 'BEGIN{ print var; }' hello |
这种方法有两点要注意. 一是-v选项要写在awk的BEGIN块前面,不然在BEGIN块里就不能使用了;有的版本的awk要求-v后面要有一个空格.所以为了代码的可移植性,-v应该要带上空格.
2. 修改ARGV
$ echo $str2 hello $ awk 'BEGIN{ var=ARGV[1]; ARGV[1]=""; print var; print ARGV[2] }' "$str2" sed.test hello sed.test $ awk 'BEGIN{ print var; print ARGV[2] }' var="$str2" sed.test sed.test $ awk '{print var;print ARGV[1];print ARGV[2]}'var="$str2" sed.test hello var=hello sed.test hello var=hello sed.test hello var=hello sed.test $ cat sed.test sed\ntest\nsed sedtestsed test\nsed |
注意:1.上面的例1和例2都修改了ARGV这个数组,如果在后面要用到这个数组则一定记住这一点;2. 上面的例二的ARGV[1]因为有一个等号,所以awk没有把它当作待处理的文件,在BEGIN块中是访问不到这样设置的变量的;所以,如果要向awk传递文件名里有"="的文件,则要作特殊处理(给文件名加上路径或用输入重定向到awk)
3.shell导出的变量
这里其实是用到了awk的ENVIRON这个内置的数组
$ str="for note" $ export str $ awk 'BEGIN{ print ENVIRON["str"]; }' for note |
4.将命令写在两对单引号里
$ awk 'BEGIN{ print "'"$string"'" }' for note |
上面的例子中,红色和蓝色的引号各成一对,这样其实string就包含在一对双引号里,所以会被shell扩展成它的值.
转载请注明出处 http://fornote.blogspot.com/
没有评论:
发表评论