use*_*266 3 linux bash shell awk
我的shell脚本是这样的:
#!/bin/bash
global_var=0
func() {
awk '$1 ~/^pattern/ {global_var=$((global_var+1))}' $1
}
func input_file_name
Run Code Online (Sandbox Code Playgroud)
我想增加全球(壳)可变global_var的内部awk动作.怎么办?正常的shell样式递增似乎不起作用.
试试这个:
func() {
awk '$1~/^pattern/ {++awk_var} END {print awk_var+0}' "$1"
}
shell_var=$(func input_file_name)
Run Code Online (Sandbox Code Playgroud)
壳awk是独立的世界,你应该这样对待他们(*)(其中,实际上,你已经在做,通过封闭的awk程序单引号,这样可以防止外壳展开任何壳在变量引用akw程序字符串).
因此,使用awk[-internal]变量执行您计数(awk_var)它已经完成处理输入文件(在后和输出END块,使用print输出awk变量stdout -的+0部分是保证输出缺省为0万一NO匹配被发现.)
请注意,通常,awk变量不需要显式初始化,因为它们默认0在数字和布尔上下文中,并且""在字符串上下文中为(空字符串).
另请注意,awk它有自己的语法,并且用于算术扩展的shell构造$((...))不适用.通常,awk变量仅通过名称(无$前缀)引用,并且++可以直接应用诸如算术运算.
在shell中使用命令替换 - $(...)- 然后允许您捕获awk命令的输出.
在特定情况下,你没有必要变量值传递到该awk计划,但如果你需要做的是,你会使用的一个或多个实例 awk的-v选项; 例如:awk -v awk_var="$shell_var" ...
在shell(bash)方面,如果你想将 awk输出添加到shell变量而不是仅仅分配它:
declare -i shell_var # make sure variable is an integer
shell_var+=$(func input_file_name) # add function's output to existing value
Run Code Online (Sandbox Code Playgroud)
(*)shell并且awk具有完全独立的命名空间,这些命名空间没有直接相互交互的方式:awk没有shell变量的概念,shell没有awk变量的概念.
技术上是可行的,但是将shell变量VALUES集成到awk程序中是不明智的- 通过使用双引号字符串来表示awk引用shell变量VALUES的程序,然后由shell ONCE 扩展,在字符串获取之前作为一个程序传递给awk.
你不能做的是从程序内部修改 shell变量awk.
由于awk程序的哪些部分由shell预先解释而哪些部分由awk后面解释('$例如,其中也有特殊含义)很快变得复杂,最好的方法是:
awk程序,以保护它免受shell的解释-v选择stdout从awk和使用命令替换或重定向通过壳捕捉到它.