[英]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.