2013-08-20 1 views
6

は私bashscriptでのawkを使用すると、この行は明らかに動作しません:それは取得しないようエスケープドル記号

line="foo bar" 
echo $line | awk '{print $1}' 

がどのように私は、$1をエスケープしますスクリプトの最初の引数に置き換えられますか? (awkスクリプトの周りの単一引用符付き)

+8

それは置き換えられません。これは '' $ line "'の最初の単語になります。 – user000001

+1

'awk'"プログラム "の一重引用符の目的は、bashがパラメータの拡張を行わないようにすることです。期待される。 –

+1

@CostiCiudatu言葉が拡張されています – SheetJS

答えて

8

スクリプトが期待通りに動作します:

$ cat script-single 
#!/bin/bash 
line="foo bar" 
echo $line | awk '{print $1}' 

$ ./script-single test 
foo 

次のように、しかし、ますブレーク(スクリプトは出力空行):

$ cat script-double 
#!/bin/bash 
line="foo bar" 
echo $line | awk "{print $1}" 

$ ./script-double test 
​ 

awkプログラムの二重引用符に注意してください。

二重引用符が$1変数を展開するため、awkコマンドはawk変数test(空)の内容を出力するスクリプト{print test}を取得します。ここに示したスクリプトだこと:

$ cat script-var 
#!/bin/bash 
line="foo bar" 
echo $line | awk -v test=baz "{print $1}" 

$ ./script-var test 
baz 

関連読書:Bash Reference Manual - QuotingShell Expansions

+1

+1のために*質問での気になる*心配。 – devnull

+0

@cmbuckleyドル記号が内部にあるときにそれを逃す方法: '' {print "$ line、" $ 1} "' – tachomi

4

として、現在書かれ、$ 1は置き換えられません(それは単一引用符で囲まれた文字列の中なので、bashがそれを解析しません)

あなたはawk "{print $1}"書いた場合、bashは変数展開ルールは、最も外側のLに依存していることを二重引用符で囲まれた文字列の中

注意を$1を拡大していきます引用のevelので、"awk '{print $1}'"$1は拡大されます