0

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

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

4 回答 4

2

您需要在反引号内进行额外的转义。尝试major=$( .. )改用..

于 2013-02-24T07:22:44.853 回答
2

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

major=`awk -v dev="$dev_name" '$2 ~ dev { print $1 }' /proc/devices`
于 2013-02-24T07:24:00.107 回答
1

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

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
于 2013-02-24T07:40:07.890 回答
0

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

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

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

于 2013-05-24T14:45:13.350 回答