2016-07-13 4 views
1

У меня есть функция в оболочке:Почему AWK -v не работает

ConfigHandler(){ 
    name=$1 
    dest=`awk -v file=$name -F"|" '{if($1~/file/)print $2}' ps.conf` 
    echo $dest 
    echo "Moving $1 to $dest ...." 
    mv `pwd`/$1 $dest/$1 
    echo "" 
    echo "" 
} 

В режиме отладки, я могу увидеть значение получать передается:

+ name=topbeat.yml 
++ awk -v file=topbeat.yml '-F|' '{if($1~/file/)print $2}' ps.conf 
+ dest= 

Но я не получаю значение из dest, я хочу, чтобы это было /etc/topbeat/, где, как

awk -F"|" '{if($1~/topbeat/)print $2}' ps.conf 

возвращает ожидаемый O/P ИЭ /etc/topbeat/

ps.conf

topbeat.yml|/etc/topbeat/ 
logstash.conf|/opt/monitor/tools/etc/ 
jmxd.tar|/opt/ 

ответ

5

Синтаксис /pattern/ может быть использован только для литералов, а не с переменными.

Вам нужно изменить:

$1~/file/ 

к:

$1 ~ file 

Обратите внимание, что структура сценария AWK является condition { action }, где condition по умолчанию 1 (истина) и { action } по умолчанию { print } (распечатать всю запись, $0). Таким образом, вам не нужно использовать if:

$1 ~ file { print $2 } 

Кроме того, помните, чтобы всегда цитирую ваши переменные:

awk -v file="$name" # ... 
echo "$dest" # etc. 

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

ConfigHandler(){ 
    dest=$(awk -v file="$1" -F"|" '$1 ~ file { print $2 }' ps.conf) 
    printf 'Moving %s to %s...\n\n\n' "$1" "$dest" 
    mv "$1" "$dest" 
} 
+0

Oh! моя вина. благодаря –

Смежные вопросы