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 - 输入记录分隔符,默认为换行符,即每行作为一个记录。
  • ARGCARGV - 类似于 Shell 的特殊变量,分别表示命令行参数的数量和数组。

这些内置变量提供了对输入数据结构、格式以及程序运行环境的强大控制能力。

冲突和解决

Shell 和 awk 同时内置了 $n 变量,在 Shell 脚本中使用变量会造成混乱。但是注意到:Shell 中使用双引号括起来的变量 "$n" 表示变量,而使用单引号'$n'不表示变量,但是 awk 在单引号'$n'中表示 awk 变量, 所以在任何情况下都使用单引号将 awk 的命令引起来就可以避免冲突。

参考文章