关于linux:在Bash变量中转义awk参数

Escaping awk parameters inside a Bash variable

我想将awk命令存储在一个变量中,以便稍后在自动脚本中使用。

如何在变量中存储命令?

1
AUTO_SCRIPT="cp a b"

如何运行存储的命令?

1
$AUTO_SCRIPT

现在,我要在此脚本中存储awk命令:

1
awk -v par="eth0" '/^iface/ && $2==par {print}' /etc/network/interfaces

(此awk通常会打印类似iface eth0 inet dhcp的内容。

所以我想把它存储起来以便以后执行:

1
AUTO_SCRIPT="awk -v par="eth0" '/^iface/ && $2==par {print}' /etc/network/interfaces"

但是,在尝试执行时:

1
2
3
$AUTO_SCRIPT
awk: cmd. line:1: '/^iface/
awk: cmd. line:1: ^ invalid char '
'' in expression

我试过什么?几乎所有的事情。用字符转义撇号。使用Qoute字符而不是撇号。尝试使用(和)字符等。没有效果。

我需要一些好主意。


不要将命令保存在变量中,没有理由这样做,因为这样做既笨拙又容易出错。只需创建一个调用awk脚本的shell函数。例如($是我的提示):

1
2
3
4
$ auto_script() { echo 'hello world'; }

$ auto_script
hello world

只需对awk脚本执行相同的操作:

1
auto_script() { awk -v par='eth0' '/^iface/ && $2==par' /etc/network/interfaces; }

将命令放入函数中是最干净的解决方案。另一种解决方案是将命令放入数组中。

1
auto_script=( awk -v par="eth0" '/^iface/ && $2==par {print}' /etc/network/interfaces )

然后像这样执行

1
"${auto_script[@]}"

请阅读提供给您的bashfaq 50链接。


除非使用其他类似于数组的机制,否则看起来您不能这样做。

当调用$AUTO_SCRIPT时,shell按空白分割内容,产生以下参数:awk-vpar=\"eth0\"'/^iface/&&$2==par{print}'/etc/network/interfaces。因此,awk(1)无法运行正确的程序,因此会出现错误。