我是Bourne shell的新手,想要进行简单的数组模拟。这有效:
COLORS='FF0000 0000FF 00FF00'
i=2
color=$(echo ${COLORS} | awk '{print $2}')
echo "color selected: $color"
我想要做的是在print中传递$i
而不是固定的$2
参数(稍后将在循环中使用)。我花了几个小时搞清楚单引号和双引号的正确组合来做到这一点,没有运气。
我最接近的是
color=$("echo ${COLORS} | awk '{print "$"${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:
感谢任何帮助。
答案 0 :(得分:5)
不要浪费时间尝试让shell在awk命令中正确扩展变量,只需使用-v
定义变量:
echo $COLORS | awk -v col=2 '{ print $col }'
就i
变量而言,这变为:
i=1
echo $COLORS | awk -v col=$i '{ print $col }'
答案 1 :(得分: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
答案 2 :(得分:1)
我这样做:
color=$(echo ${COLORS} | awk "{print \$$i}")
如果您使用'...'
,则不会展开内容。但是您希望在脚本中插入$i
的值。所以要使用"..."
,它会进行变量扩展。但是你也想在AWK的数字前加$
,所以你必须逃避它(\$
)。
答案 3 :(得分:1)
-v foo=bar
提供了BEGIN
等调用分配的变量,其中分配了简单baz=qux
的变量不在。{/ p>
BEGIN { print foo, bar; }
{ print foo, bar; }
看到差异:
echo Don\'t Panic! | awk -f ./hello.awk -v foo=Hello bar=World
Hello
Hello World