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 的命令引起来就可以避免冲突。