我要为我的设备编写脚本。 这是我的初始代码:
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$/ $
似乎语法应该是正确的,任何人都可以给我一个答案吗?
答案 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将它扩展两次,并且在反引号(`)之间不会扩展双引号,因此这将输出正确的结果。