我的shell脚本是这样的:
#!/bin/bash
global_var=0
func() {
awk '$1 ~/^pattern/ {global_var=$((global_var+1))}' $1
}
func input_file_name
我想在global_var
操作中增加全局(shell)变量awk
。怎么办?正常的shell样式递增似乎不起作用。
答案 0 :(得分:8)
试试这个:
func() {
awk '$1~/^pattern/ {++awk_var} END {print awk_var+0}' "$1"
}
shell_var=$(func input_file_name)
shell和awk
是不同的世界,您应该将它们视为(*)(实际上,您已经在做了,通过封闭您的{{1}在单引号中编程,这会阻止shell扩展awk
程序字符串中的任何 shell 变量引用。 / p>
因此,使用akw
[ - internal]变量来执行计数(awk
),并在完成处理输入文件后输出{({} 1}}阻止,使用awk_var
将END
变量输出到print
- awk
部分是为了确保输出默认为{ {1}}如果未找到匹配项。)
请注意,通常,stdout
变量不需要显式初始化,因为它们在数字和布尔上下文中默认为+0
,在字符串上下文中默认为0
(空字符串)。
另请注意, awk
具有自己的语法,而 shell构造(例如0
用于算术扩展)不适用。通常,""
变量仅通过名称引用 (无awk
前缀),并且可以直接应用$((...))
等算术运算。
在shell中使用命令替换 - awk
- 然后允许您捕获$
命令的输出。
在您的特定情况下,您无需将变量值传递到 ++
程序,但如果您需要这样做,则需要使用一个或多个{{{ 1}}的{{1}}选项;例如:$(...)
在shell(awk
)方面,如果您想将 awk
的输出添加到shell变量而不是分配它:
awk
(*) shell和-v
具有完全独立的名称空间,这些名称空间没有直接相互作用的方式:awk -v awk_var="$shell_var" ...
没有shell变量的概念,而shell没有概念bash
个变量。
通过使用 double VALUES 集成到awk
程序中是技术上可行但不明智的 > -quoted字符串表示declare -i shell_var # make sure variable is an integer
shell_var+=$(func input_file_name) # add function's output to existing value
程序,在该程序中引用 shell 变量 VALUES ,然后由 shell ONCE进行扩展,在字符串作为程序传递给awk
之前
你不能做的是从awk
程序中修改一个shell变量。
由于awk
程序的哪些部分由shell预先解释而哪些部分由awk
稍后解释(其中awk
具有特殊含义,因此很快变得复杂起来例如,最佳方法是:
awk
程序,以防止它被shell解释awk
选项的实例awk
打印到awk
并使用命令替换或重定向通过shell捕获它。