2012-02-13 1 views
1

Я новичок в Bourne shell и хочу сделать простое симуляцию массива. Это работает:Как передать переменную оболочки awk в оболочку 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: 

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

ответ

1

Я хотел бы сделать это следующим образом:

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

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

+0

Спасибо! Он работает хорошо, хотя я не уверен, что лучше понимаю цитаты. Можно было бы подумать, что двойные кавычки съедаются оболочкой после расширения материала в ней, но, похоже, они также передаются awk. – Arthur

+0

Они * * съедены оболочкой, но одинаковые кавычки. Оба заключают строку. Например, обычно 'foo a b' передает' a' как первый аргумент 'foo', а' b' - второй аргумент. Но с 'foo 'a b" 'оболочка передает' a b' как единственный аргумент 'foo'. Большая разница между одиночными и двойными кавычками заключается в том, что с двойными кавычками вы можете «вставлять» другие вещи, такие как переменные: если вы передаете '' $ i'' в качестве аргумента, действительно передается строка '$ i'. Но с '' $ i "' передается содержимое переменной 'i'. – DarkDust

5

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

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 

, который дает следующий результат на этом компьютере:

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

Вы также можете получить 'i' таким же образом, либо с помощью' export i', либо путем вызова awk с 'i = 1 awk ...'. –

+0

Точно. Это помогает избежать проблемы с кавычками и позволяет получить произвольное количество значений из вашей среды. Это то, что отлично подходит для Unix ™: у нас есть несколько способов получить соответствующую информацию в программе. –

1

Переменные, назначенные на invokation как -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