![awk 中 $1、${1} 和 $"1" 之间的区别](https://linux22.com/image/114594/awk%20%E4%B8%AD%20%241%E3%80%81%24%7B1%7D%20%E5%92%8C%20%24%221%22%20%E4%B9%8B%E9%97%B4%E7%9A%84%E5%8C%BA%E5%88%AB.png)
在处理脚本时,以下脚本出现错误
file * | awk '{ ${1}=""; print substr(${0},2) }';
而以下两个脚本都成功运行
file * | awk '{ $"1"=""; print substr($"0",2) }';
和
file * | awk '{ $1=""; print substr($0,2) }';
不都是$1, ${1}, $"1"
参数替换吗?我的awk
语法有问题吗?
答案1
awk
不是外壳。awk
有自己的语法、句法和语义。${1}
不是语法上正确的awk
代码,而 和$1
都是$"1"
(并且它们在 中是等效的awk
)。在 中awk
,这些不是替换。
其中awk
,$1
指当前输入记录的第一个字段,$0
指完整的输入记录,而在 shell 中,$1
指第一个位置参数(通常是脚本或函数的命令行中的第一个参数),$0
通常指当前 shell 或 shell 脚本的名称。
Shell变量和awk
变量也是完全分开的。这就是为什么如果您需要将值从 shell“导入”到脚本,则awk
需要使用命令行标志来设置其变量:-v
awk
$ awk -v var="$var" '{...}'
您还可以为awk
脚本提供 shell 变量的值,如下所示:
$ awk '{...}' var="$var"
这是几乎与使用 with 的操作相同-v
,只是变量var
在任何块中都将为空BEGIN
。一个BEGIN
块被执行前查看输入数据,并设置变量后这样一个块的执行。
你也可以做
$ awk '{...}' var="$value1" file1 var="$value2" file2
这使得该变量获得了刚刚被处理的var
shell变量的值,然后又得到了刚刚被处理的shell变量的值。$value1
file1
$value2
file2
如果有的话文件具有上一个示例中的名称var="$value1"
(例如var="42"
,这是一个完全合法的 Unix 文件名),该文件将不是被处理。此外,如果命令行上的 shell 文件名通配模式选取的文件的名称看起来像是对变量的赋值,则该赋值将在脚本中处于活动状态awk
。