1

So I have a simple shell script called try.sh:

#! /bin/ksh

echo "'" | awk '

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

and it runs fine:

$ ./try.sh  
'ello, world

But ksh -n is not altogether happy with it:

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

I can use tricks (awk variables, awk hex sequences, etc.) to make this go away, but surely there's some native elegant way to appease the ksh syntax checker (if nothing else, for the case when the embedded language has no provision for workarounds). What am I forgetting?

[update: apparently the syntax checker is flagging the line because a quoted string with embedded newline is followed by another quoted string with no intervening white space. David Korn says that he'll be reviewing the check for the next version of ksh. See the ast-users mailing list archives for details.]

4

1 に答える 1

1

最小限のコード スニペットを次に示します。IMO、引用文字を変数に渡すことは、引用/引用解除パターンを回避するため、厄介な問題から抜け出す最もエレガントな方法であり、表示される awk コードは awk が処理するものと同じです。

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

元の質問では、unix シェルに組み込まれている他の言語でよく使用される、quote/unquote パターンと呼ばれるものを使用しています。

このトリックは、有効な awk プログラム テキストを形成するシェルからの一連の連結された引用符付き文字列と引用符なし文字列を awk に提示します。これにより、コードの保守が非常に難しくなります。プログラマーは有効な awk コードを確認できなくなるためです。

特殊文字を変数として awk に渡すと、このパターンを回避できます。

于 2012-11-30T21:10:12.640 に答える