为什么awk中的双引号引起语法错误

时间:2013-02-24 07:01:31

标签: linux bash awk

我要为我的设备编写脚本。 这是我的初始代码:

dev_name=random_sting
major=`awk "\$2 ~ /^${dev_name}\$/ { print \$1 }" /proc/devices`

然后发生错误

awk:  ~ /^random_string$/ { print  }
awk:  ^ syntax error

与此同时,我做了一个实验:

var1=random_string
echo "\$ /^$var1\$/ \$"

输出

$ /^random_string$/ $

似乎语法应该是正确的,任何人都可以给我一个答案吗?

4 个答案:

答案 0 :(得分:2)

你需要在后面的滴答声内额外逃脱。请尝试使用major=$( .. )代替..

答案 1 :(得分:2)

在这种情况下,您还可以使用-v的{​​{1}}选项绕过转义的需要,就像这样

awk

答案 2 :(得分:1)

你在反引号中的表达式将通过2个shell / unescape阶段。

awk "\$2 ~ /^${dev_name}\$/ { print \$1 }" /proc/devices

...将被你的bash扩展和转移到......

awk "$2 ~ /^random_string$/ { print $1 }" /proc/devices`

...由反引号启动的shell将会扩展并再次转向...

awk "~ /^random_string$/ { print  }" /proc/devices`

...因为$ 1和$ 2未定义。

你想要做的是两次逃避$ 1和$ 2;

awk "\\\$2 ~ /^${dev_name}\$/ { print \\\$1 }" /proc/devices

...制作执行的最终结果......

awk "$2 ~ /^random_string\$/ { print $1 }" /proc/devices

答案 3 :(得分:0)

这就是我解决问题的方法。 让我们仔细研究这一行:

dev_name='loop' ; major=` awk "\\\$2 ~ /^\${dev_name}\\\$/ { print \\\$1 }" /proc/devices` ; echo $major

bash将它扩展两次,并且在反引号(`)之间不会扩展双引号,因此这将输出正确的结果。