所以我有一个名为 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。]
答案 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可以避免这种模式。