如何在Bourne shell中将shell变量传递给awk?

Art*_*hur 2 awk sh

我是Bourne shell的新手,想做简单的阵列模拟.这有效:

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

我想要做的是在print中传递$i而不是固定$2参数(稍后将在循环中使用).我花了几个小时搞清楚单引号和双引号的正确组合来做到这一点,没有运气.

我得到的最接近的是

color=$("echo ${COLORS} | awk '{print "$"${i}}'")
Run Code Online (Sandbox Code Playgroud)

运行结果是:

+ 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:
Run Code Online (Sandbox Code Playgroud)

任何帮助表示赞赏.

Mic*_*ber 5

不要浪费时间尝试让shell在awk命令中正确扩展变量,只需使用-v以下命令定义变量:

echo $COLORS | awk -v col=2 '{ print $col }'
Run Code Online (Sandbox Code Playgroud)

就你的i变量而言,这变为:

i=1
echo $COLORS | awk -v col=$i '{ print $col }'
Run Code Online (Sandbox Code Playgroud)