2012-02-13 10 views
1

私はBourneシェルの初心者で、単純な配列シミュレーションを行いたいと思っています。これは動作します:Bourneシェルでawkにシェル変数を渡すには?

COLORS='FF0000 0000FF 00FF00' 
i=2 
color=$(echo ${COLORS} | awk '{print $2}') 
echo "color selected: $color" 

は、私は何をしたい(これは後のループで使用されます)印刷中の固定$2パラメータの代わりに$iを渡すことです。これを行うには、一重引用符と二重引用符を正しく組み合わせて何時間も費やした。

+ COLORS=FF0000 0000FF 00FF00 
+ i=2 
+ echo FF0000 0000FF 00FF00 | awk '{print $2}' 
./tempgraph.sh: ./tempgraph.sh: 37: echo FF0000 0000FF 00FF00 | awk '{print $2}': not found 
+ color= 
+ echo color selected: 
color selected: 

すべてのヘルプは高く評価されています

私が得た最も近いが、実行結果が

color=$("echo ${COLORS} | awk '{print "$"${i}}'") 

です。

答えて

1

私はこのようにそれを行うだろう:

color=$(echo ${COLORS} | awk "{print \$$i}") 

あなたが'...'を使用している場合、コンテンツが展開されていません。しかし、$iの値をスクリプトに挿入します。したがって、可変拡大を行う"..."が使用されます。しかし、AWKの番号の前に$が必要なので、それをエスケープする必要があります(\$)。

+0

ありがとうございました!それはうまく動作しますが、私は引用符をよく理解しているかどうかはわかりません。 1つは二重引用符がそれの中のものを拡張した後にシェルによって食べられると思うでしょうが、awkにも渡されるようです。 – Arthur

+0

* *はシェルによって食べられますが、一重引用符も同様です。両方とも文字列を囲みます。たとえば、通常 'foo a b 'は' foo'の第1引数として 'a'を、第2引数として' b'を渡します。しかし 'foo" a b ""を使うと、シェルは 'foo'の唯一の引数として' a'を渡します。一重引用符と二重引用符の大きな違いは、二重引用符では、変数のような他のものを "埋め込む"ことができるということです: '$ i 'を引数として渡すと、本当に' $ i'という文字列が渡されます。しかし '' $ i ''で、変数' i'の内容が渡されます。 – DarkDust

5

だけ-vを使用して変数を定義し、awkコマンドで正しく変数を拡張するためのシェルを取得しようと、あなたの時間を無駄にしないでください:

echo $COLORS | awk -v col=2 '{ print $col }' 

あなたi変数の面では、これは次のようになります。

i=1 
echo $COLORS | awk -v col=$i '{ print $col }' 
+0

ありがとう、これは完全に動作します。他の人がシェルの引用を苦労するのを助けるかもしれないので、私は他の答えを受け入れました。 – Arthur

2

ます。また、直接お使いの環境で取得できます。

export COLORS='FF0000 0000FF 00FF00' 
awk 'END {split(ENVIRON["COLORS"],colors);for(col in colors) { print "Color",col,"is",colors[col]}}' /dev/null 

このMac上の次の出力与える:

Color 2 is 0000FF 
Color 3 is 00FF00 
Color 1 is FF0000 
+1

'i'でも' export i'や 'i = 1 awk ...'でawkを呼び出すことで、同じ方法で得ることができます。 –

+0

正確に。これはクォートの問題を避けるのに役立ち、環境から任意の数の値を取得することができます。 これはUnix™にとって素晴らしいことです:我々は、プログラムに関連する情報を得るための複数の方法があります。 –

1

-v foo=barようinvokationに割り当てられた変数は、単純なbaz=quxに代入された変数ではないBEGINでご利用いただけます。

BEGIN { print foo, bar; } 
{ print foo, bar; } 

は違いを参照してください。

echo Don\'t Panic! | awk -f ./hello.awk -v foo=Hello bar=World 
Hello 
Hello World 
関連する問題