如何防止单引号混淆ksh -n

时间:2012-07-11 22:34:21

标签: escaping ksh

所以我有一个名为 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的支票。有关详细信息,请参阅the ast-users mailing list archives。]

1 个答案:

答案 0 :(得分:1)

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

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

原始问题使用我称之为quote / unquote模式的东西,它与嵌入在unix shell中的其他语言一起使用。

这个技巧提供了一系列来自shell的串联引用和不带引号的字符串,它们共同组成了一个有效的awk程序文本。这使得代码很难维护,因为作为程序员,你再也看不到有效的awk代码了。

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