1

所以我有一个名为try.sh的简单 shell 脚本:

#! /bin/ksh

echo "'" | awk '

/'\''/ {
print "'\''ello, world"
}
'

它运行良好:

$ ./try.sh  
'ello, world

但是ksh -n对此并不完全满意:

$ ksh -n ./try.sh
./try.sh: warning: line 3: ' quote may be missing
./try.sh: warning: line 5: ' quote may be missing

我可以使用技巧(awk 变量、awk 十六进制序列等)来解决这个问题,但肯定有一些本机优雅的方式来安抚 ksh 语法检查器(如果没有别的,对于嵌入式语言没有规定的情况)变通方法)。我忘记了什么?

[更新:显然语法检查器正在标记该行,因为带有嵌入换行符的带引号的字符串后面跟着另一个带引号的字符串,中间没有空格。David Korn 说他将审查下一个版本的 ksh 的检查。有关详细信息,请参阅ast-users 邮件列表存档。]

4

1 回答 1

1

这是一个最小的代码片段。IMO,在变量中传递引号字符是解决令人讨厌的问题的最优雅的方法,因为它避免了引用/取消引用模式,并且您看到的 awk 代码与 awk 处理的代码相同。

$ echo "'" | 
   awk -v q=\'  'q { print q"Hello, world"q }'
'Hello, world'

最初的问题使用了我所说的引用/取消引用模式,该模式与嵌入在 unix shell 中的其他语言一起使用很多。

该技巧为 awk 提供了一系列来自 shell 的连接的带引号和不带引号的字符串,它们一起形成了有效的 awk 程序文本。这使得代码很难维护,因为作为程序员,您再也看不到有效的 awk 代码了。

将特殊字符作为变量传递给 awk 可以避免这种模式。

于 2012-11-30T21:10:12.640 回答