转义Bash变量

时间:2018-04-15 16:54:30

标签: linux bash shell awk

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

如何在变量中存储命令?

AUTO_SCRIPT="cp a b"

如何运行存储的命令?

$AUTO_SCRIPT

现在我想在这个脚本中存储一个awk命令:

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

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

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

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

但是在尝试执行时:

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

我尝试了什么? 几乎所有的。使用\ character转义撇号。使用qoute字符而不是撇号。尝试使用(和)字符等。什么都行不通。

我在这里需要一些好主意。

3 个答案:

答案 0 :(得分:4)

不要将命令保存在变量中,没有理由,它的笨重和容易出错。只需创建一个调用awk脚本的shell函数。例如($ auto_script() { echo 'hello world'; } $ auto_script hello world 是我的提示):

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

为你的awk脚本做同样的事情:

{{1}}

答案 1 :(得分:2)

将命令放在函数中是最干净的解决方案。唯一的解决方案是将命令放在数组

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

然后像这样执行

"${auto_script[@]}"

阅读你给出的BashFAQ#50链接。

答案 2 :(得分:-1)

除非你使用像数组这样的其他机制,否则看起来你不能。

当您致电$AUTO_SCRIPT时,shell会按空格分割内容,从而产生以下参数:awk-vpar=\"eth0\"'/^iface/,{{ 1}},&&$2==par{print}'。结果你awk(1)没有得到一个正确的程序来运行,你得到一个错误。