为什么awk -v不工作

Sha*_*vek 1 shell awk

我在shell中有一个函数:

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 ""
}
Run Code Online (Sandbox Code Playgroud)

在调试模式下,我可以看到传递的值:

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

但我没有得到它的价值dest,我希望它是/etc/topbeat/,在哪里

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

返回预期的O/P即 /etc/topbeat/

ps.conf

topbeat.yml|/etc/topbeat/
logstash.conf|/opt/monitor/tools/etc/
jmxd.tar|/opt/
Run Code Online (Sandbox Code Playgroud)

Tom*_*ech 5

语法/pattern/只能用于文字,而不能用于变量.

你需要改变:

$1~/file/
Run Code Online (Sandbox Code Playgroud)

至:

$1 ~ file
Run Code Online (Sandbox Code Playgroud)

请注意,awk脚本的结构是condition { action },condition默认为1(true),{ action }默认为{ print }(打印整个记录$0).因此,您不需要使用if:

$1 ~ file { print $2 }
Run Code Online (Sandbox Code Playgroud)

另外,请记住始终引用您的变量:

awk -v file="$name" # ...
echo "$dest" # etc.
Run Code Online (Sandbox Code Playgroud)

通过几次更改,这将是最终结果:

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"
}
Run Code Online (Sandbox Code Playgroud)