【问题标题】:Is it possible to force bash to do an in-place expansion of a variable whose value contains quotes? [duplicate]是否可以强制 bash 对其值包含引号的变量进行就地扩展? [复制]
【发布时间】:2021-10-25 03:24:24
【问题描述】:

考虑以下简单函数。

X() {
 echo "$1"
 echo "$2"
 echo "$3"
}

现在考虑以下变量:

args="-H 'h1 : v1'"

当我运行命令X $args 时,我得到以下输出:

-H
'h1
:

另一方面,如果我运行命令X -H 'h1 : v1',我会得到以下输出:

-H
h1 : v1

请注意,在后一种情况下,变量值内的引号被正确解释为分隔符。

是否可以修改变量的声明或使用变量的调用以强制上述两个输出相等?

【问题讨论】:

  • 作为数据的引号不能替代作为语法的缺失引号。
  • 解决这个问题的正确方法是将字符串列表存储在数组中,而不是字符串。
  • 即:args=( -H 'h1 : v1' ),然后是X "${args[@]}"
  • Re: X -H 'h1 : v1' -- 你没有在变量的值中显示引号。您的示例中的变量在哪里?
  • $2 从未包含引号。 shell 使用它们将 h1 : v1 视为一个单词,而不是 3 个单独的单词,然后将该单词分配给位置参数。

标签: bash environment-variables command-line-arguments


【解决方案1】:

这就是数组的用途。

$ args=(-H 'h1: v1')
$ printf '%s\n' "${args[@]}"
-H
h1 : v1

【讨论】:

  • 如果这是一个答案的原因是我们没有足够明确/重点突出的副本来关闭它,我想知道我们是否需要为此目的构建一个规范实例;它肯定经常出现。
  • 我已经失去了希望任何单一的答案都足以解决这些问题的细微差别。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-04
  • 2011-04-27
  • 2011-09-06
  • 2021-07-18
  • 1970-01-01
  • 2012-01-25
  • 1970-01-01
相关资源
最近更新 更多