shell变量与awk变量冲突的处理
Shell 中的特殊变量
Shell 预定义了一些特殊变量,它们通常包含一个或两个连字符作为前缀:
$0- 当前脚本的名字。$1,$2, ... - 传递给脚本或函数的位置参数。$#- 传递给脚本或函数的参数个数。$*- 所有参数作为一个字符串。$@- 参数列表(与$*类似,但在引号中有区别)。$?- 上一条命令的退出状态。$$- 当前 Shell 的进程 ID。$!- 最后一个后台进程的 PID。
awk 内置变量
awk 提供了多个内置变量来访问输入数据和其他特性:
$n- 表示当前行的第 n 个字段(列),其中$1是第一列,$2是第二列,依此类推。$0- 表示整个当前行的内容。NF- 当前行的字段数(列数)。NR- 到目前为止处理的总行数(全局行号)。FNR- 当前文件中的行号(对于多文件输入,每个新文件计数会重新开始)。FILENAME- 当前正在读取的文件名。FS- 字段分隔符,默认为空白字符(空格或制表符)。可以设置为其他值以改变字段划分规则。OFS- 输出字段分隔符,默认为空格。当使用逗号,分隔输出字段时,awk会用这个值替换逗号。ORS- 输出记录分隔符,默认为换行符\n。RS- 输入记录分隔符,默认为换行符,即每行作为一个记录。ARGC和ARGV- 类似于 Shell 的特殊变量,分别表示命令行参数的数量和数组。
这些内置变量提供了对输入数据结构、格式以及程序运行环境的强大控制能力。
冲突和解决
Shell 和 awk 同时内置了 $n 变量,在 Shell
脚本中使用变量会造成混乱。但是注意到:Shell 中使用双引号括起来的变量
"$n"
表示变量,而使用单引号'$n'不表示变量,但是 awk
在单引号'$n'中表示 awk 变量,
所以在任何情况下都使用单引号将 awk 的命令引起来就可以避免冲突。