我的shell脚本是这样的:
#!/bin/bash global_var=0 func() { awk '$1 ~/^pattern/ {global_var=$((global_var+1))}' $1 } func input_file_name
我想在awk
动作中增加全局(shell)variablesglobal_var
。 怎么做? 正常的shell风格增加似乎没有工作。
尝试这个:
func() { awk '$1~/^pattern/ {++awk_var} END {print awk_var+0}' "$1" } shell_var=$(func input_file_name)
shell和awk
是独立的世界,你应该把它们当作 (*)(实际上,你已经在做这个了,把awk
程序用单引号括起来,这样可以防止shell扩展任何shell变量引用你的akw
程序字符串 )。
因此, 使用awk
[-internal]变量执行计数( awk_var
)并在输入文件完成处理后输出(在END
块中, 使用print
将awk
变量输出到stdout
– +0
部分用于确保如果发现NO匹配,则输出默认为0
)。
请注意,通常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
(*) shell和awk
有完全独立的命名空间,没有直接的交互方式: awk
没有shell变量的概念,shell没有awk
变量的概念。
这在技术上是可行的,但不建议将shell变量VALUES集成到awk
程序中 – 通过使用双引号字符串来表示awk
程序,在该程序中引用shell变量VALUES ,然后由shell ONCE进行扩展。字符串作为程序传递给awk
。
你不能做的是从awk
程序中修改一个shell变量。
由于awk
程序的哪些部分由shell awk
解释,哪些部分是由awk
稍后解释(例如'$
也有特殊含义),它会很快变得复杂, 最好的方法是:
awk
程序,以防止它被shell解释 -v
选项的实例 awk
打印到stdout
,并使用命令替换或重定向通过shell捕获它。