【问题标题】:Escaping awk parameters inside a Bash variable在 Bash 变量中转义 awk 参数
【发布时间】:2018-04-15 16:54:30
【问题描述】:

我想将 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

我尝试了什么? 几乎所有的。用 \ 字符转义撇号。使用 qoute 字符而不是撇号。尝试使用 ( 和 ) 字符等等。没有任何效果。

我需要一些好主意。

【问题讨论】:

标签: linux bash shell awk


【解决方案1】:

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

$ auto_script() { echo 'hello world'; }

$ auto_script
hello world

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

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

【讨论】:

    【解决方案2】:

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

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

    然后像这样执行

    "${auto_script[@]}"
    

    阅读您获得的 BashFAQ #50 链接。

    【讨论】:

      【解决方案3】:

      除非您使用数组等其他机制,否则您似乎无法做到。

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

      【讨论】:

      • 阅读问题 cmets 中的 bash 常见问题解答链接。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-13
      • 2014-09-13
      • 1970-01-01
      • 2012-11-14
      • 2013-07-25
      • 2017-11-20
      • 2023-03-30
      相关资源
      最近更新 更多