Answers:
它实际上在POSIX中awk
(我相信也链接到POSIX 2008,以前的版本中也有)。-v
在“ 选项”部分中进行了说明,另一种方式在“ 操作数”部分中。
-v
在文件名的末尾传递和传递之间是有区别的:
-v
:应用程序应确保赋值参数的形式与赋值操作数相同。指定的变量分配应在执行awk程序之前发生,包括与BEGIN模式相关的动作(如果有)。可以指定多次出现此选项。
[...]每个此类变量分配都应在处理以下文件(如果有)之前进行。因此,第一个文件参数之前的赋值应在BEGIN动作(如果有)之后执行,而最后一个文件参数之后的赋值应在END操作(如果有)之前发生。如果没有文件参数,则应在处理标准输入之前执行分配。
例:
$ cat input
hello
hello
$ awk -v var=one 'BEGIN{print var} /hello/{print var} END{print var}' \
var=two input var=three input var=four
one
two
two
three
three
four
awk
优先考虑将其作为变量赋值 ...这有一个主要的推论,即。在所有情况下,如果文件名采用这种形式,它将被忽略并设置变量。看来避免这种冲突的唯一方法是确保当前工作目录的文件名必须始终加上前缀及其相对路径:./var=three
-v
引入语法的原因之一。-v
今后,您应该将语法视为进行赋值的首选方法。
awk
,则可以使用以下捕获:[ "$myfile" == "${myfile#/}" ] && myfile="./$myfile"
这是在中外部设置变量的一种旧样式awk
。它是模棱两可的(如果文件名叫foo=cat
),那么以后的版本中添加了一个-v
选项。它可能应该可以向后兼容,但是您不能保证。正如我所说,该-v
选项是较新的,因此并非所有版本awk
都支持它。
s answer](http://unix.stackexchange.com/a/34258/9537),
-v`中所述,参数赋值的生效时间不同。同样-v
是在POSIX和应该存在,但在所有的最古老的awk
实现。使用./
或确保文件名包含非标识符字符可能是消除歧义的最可靠方法。