【问题标题】:How to keep single quotes from confusing ksh -n如何防止单引号混淆 ksh -n
【发布时间】:2012-07-11 22:34:21
【问题描述】:

所以我有一个名为 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。]

【问题讨论】:

  • 将特定调用的 stderr 重定向到 2>/dev/null ? ...我也喜欢整洁的东西,但考虑到警告状态,我只会将此作为“功能”;-)...祝你好运。
  • @shellter 好主意,除了调用是通过安装的通用规则(基础 nmake 制定规则的一部分,用于处理所有 shell 脚本)。我可以在关联的Makefile 中为这个特定的脚本写一条规则,但这会冒犯我的敏感;-)
  • 在 [ast-users] 邮件列表中重复。
  • 这基本上是在同一脚本中混合语言的问题。在这种情况下,它有三层深度:nmake->shell->nawk。我竭尽全力避免这种情况并保持可读性。

标签: escaping ksh


【解决方案1】:

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

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

最初的问题使用了我所说的引用/取消引用模式,这种模式在 unix shell 中嵌入的其他语言中被大量使用。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-10
    • 1970-01-01
    • 2015-04-02
    • 1970-01-01
    • 2013-05-29
    • 2011-02-15
    • 2015-06-11
    • 1970-01-01
    相关资源
    最近更新 更多