【问题标题】:Grouping command substitution without double quotes? "$()" without the ""没有双引号的分组命令替换? "$()" 没有 ""
【发布时间】:2014-07-20 08:58:59
【问题描述】:

我正在编写一个涉及生成 Awk 程序并通过awk $(...) 运行它们的脚本,如

[lynko@hephaestus] ~ % awk $(echo 'BEGIN { print "hello!" }')

生成的程序最终会变得更加复杂,但首先我想确保这是可能的。过去我做过

[lynko@hephaestus] ~ % program=$(echo 'BEGIN { print "hello" }')
[lynko@hephaestus] ~ % awk "$program"
hello!

分组不足为奇。但是第一个示例(在 GNU awk 下,它给出的错误消息比我另一台机器上默认的 mawk 更有用)给出了

[lynko@hephaestus] ~ % awk $(echo 'BEGIN { print "hello!" }')
awk: cmd. line:1: BEGIN blocks must have an action part

大概是因为这是作为awk BEGIN { print "hello!" } 而不是awk 'BEGIN { print "hello!" }' 执行的。有没有办法可以强制$(...) 保持为一个组?我宁愿不使用"$()",因为我必须转义程序生成器中的所有双引号。

我在 Crunchbang Waldorf 上运行 Bash 4.2.37 和 mawk 1.3.3。

【问题讨论】:

  • 你不需要在$()中转义双引号

标签: bash awk words command-substitution


【解决方案1】:

在它周围加上引号。您不需要转义其中的双引号:

awk "$(echo 'BEGIN { print "hello!" }')"

【讨论】:

  • 在交互式 shell 中,! 用于历史替换。您需要将其转义为\!。这不应该影响脚本。
【解决方案2】:

我也想知道您为什么要使用 echo 语句。 awk 不需要。

awk 'BEGIN { print "Awk SQUAWK!" }'

这将完美地工作。

【讨论】:

  • 这是一个人为的例子来说明我的问题(我误解了"$()")。有问题的实际代码涉及将命令行参数转换为适当的 awk 语句的循环。这实际上使您可以将 BEGIN 块与普通操作混合起来非常方便:)
猜你喜欢
  • 2021-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-15
  • 1970-01-01
  • 2013-07-02
  • 1970-01-01
相关资源
最近更新 更多