繁体   English   中英

为什么awk中双引号中的〜导致语法错误

[英]Why a ~ in double quotes within awk caused syntax error

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

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$/ $

似乎语法应该正确,有人可以给我答案吗?

您需要在背tick内有其他转义符。 尝试改为使用major=$( .. )

在这种情况下,您也可以使用awk-v选项绕过转义的需要,如下所示

major=`awk -v dev="$dev_name" '$2 ~ dev { print $1 }' /proc/devices`

您在反引号内的表达将经过2个shell / unscape阶段。

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

...将被您的bash扩展和释放

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

...由反引号开始的外壳将展开并再次逃逸到...

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

这就是我解决问题的方式。 让我们仔细检查这一行:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM