2013-02-24 113 views
0

我正在为我的设备写脚本。 这是我最初的代码:为什么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$/ $ 

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

回答

0

这就是我如何解决这个问题。 让我们审视这条线:

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

庆典展开两次,双引号不是反引号(')之间展开,所以这是要输出正确结果。

2

您需要额外的退格。尝试使用major=$(..)代替..

+0

不,您需要使用单引号而不是双引号来分隔awk脚本。请参阅@ user0001的答案。 – 2013-02-24 12:55:37

+0

他也可以这样做,或者两者兼而有之。我也会使用单引号,但是如果他希望使用双引号,那么将反引号改为'$(..)'应该足以使其工作。 – Scrutinizer 2013-02-24 13:18:49

+1

使用双引号是绝对错误的做法。它使你的脚本变得更加复杂,难以增强和未来,并且容易出错而仅使用单引号。 – 2013-02-25 02:20:41

2

在这种情况下,你也可以绕过逃离,使用awk-v选项的需要,这样

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

+1这是正确的答案。双引号你的shell变量:'dev =“$ devname”'。 – 2013-02-24 12:53:43

+0

这是一个我不知道的亲切方法。 – dspjm 2013-02-26 11:58:39

1

你的反引号里面表达将通过2个弹/ UNESCAPE阶段。

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

...将扩大,并通过您的bash来转义...

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

...其中由反引号启动的shell将再次扩大和UNESCAPE到...

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 
+0

不要这样做。永远。通过将awk变量赋值给awk,将shell变量的值传递给awk,并将脚本放在单引号中。 – 2013-02-26 02:39:55

+0

感谢您的回答,此方法正常工作。 – dspjm 2013-02-26 11:59:29

+0

但是,我不小心将命令写入awk“\\ $ 2〜/^$ {dev_name} \ $/{print \\ $ 1}”/ proc/devices,它也起作用,使我感到困惑......为什么它没有“首先扩大1美元和2美元。 – dspjm 2013-02-26 12:26:06