Как передать переменную оболочки в awk в оболочке Bourne? - PullRequest
1 голос
/ 13 февраля 2012

Я новичок в оболочке Bourne и хочу сделать простое моделирование массива.Это работает:

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

Я хочу передать $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:

Любая помощь приветствуется.

Ответы [ 4 ]

5 голосов
/ 13 февраля 2012

Не тратьте свое время, пытаясь заставить оболочку правильно развернуть переменную в команде awk, просто определите переменную, используя -v:

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

В терминах вашей переменной iэто становится:

i=1
echo $COLORS | awk -v col=$i '{ print $col }'
2 голосов
/ 13 февраля 2012

Вы также можете получить непосредственно в своей среде:

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 голос
/ 11 октября 2013

Переменные, назначенные при вызове, такие как -v foo=bar, доступны в BEGIN, где переменные, назначенные простым baz=qux, не доступны.

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

вижу разницу:

echo Don\'t Panic! | awk -f ./hello.awk -v foo=Hello bar=World
Hello
Hello World
1 голос
/ 13 февраля 2012

Я бы сделал это так:

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

Если вы используете '...', содержимое не будет расширено.Но вы хотите, чтобы значение $i было вставлено в ваш скрипт.Таким образом, "..." должен использоваться, что делает расширение переменной.Но вам также нужно $ перед номером для AWK, поэтому вы должны его избежать (\$).

...