【问题标题】:Outputting bash-quoted array from bash从 bash 输出 bash 引用的数组
【发布时间】:2014-07-05 04:04:42
【问题描述】:

在 bash 中(可能使用通常安装在 Unix 系统上的命令)我想将数组中的所有元素输出到终端,使数组的每个元素都是正确引用的 bash 字符串。

例如,假设数组包含三个元素(我将在此处列出它们每行一个数组元素以避免我们混淆引号是否是字符串的一部分):

foo
qux bar
wibble 'smoo' "blep"

理想情况下我想输出:

foo "qux bar" "wibble 'smoo' \"blep\""

但是,如果它使实现变得相当简单,我也可以接受:

"foo" "qux bar" "wibble 'smoo' \"blep\""

甚至这个:

foo qux\ bar wibble\ \'smoo\'\ \"blep\"

明确地说,我知道将 $@ 放在引号中时会发生什么。例如:

echo "$@"

然而,这是不够的,因为虽然引用 "$@" 会导致数组在每个项目周围用引号展开,但这些引号不会输出,即我们得到:

foo qux bar wibble 'smoo' "blep"

我的意图是,我想要一个 bash 脚本来输出命令行,然后可以将其复制并粘贴回 shell,如果参数包含引号/空格,它们不会被错误地分解。如果输出看起来“不错”——它与用户通常使用的格式相同(在不必要的地方避免引号等)——这是一个好处,但我的主要目标是稳健。

显然,一种解决方案是遍历数组,检测空格和引号,根据需要对其进行转义,并用引号括起来。但是在 bash 中重新实现 bash 转义规则感觉有点脏(并且可能容易出错) - 所以我想知道我是否缺少一些可以让 bash 为我执行此操作的机制。

【问题讨论】:

  • 我不知道有任何这样的内置机制。当它向程序传递参数时,它有办法做到这一点("$@" 就是这样做的),但不是为了向用户展示。
  • [Q]uoting "$@" causes the array to be expanded with quotes around each item[...] -- 不是真的,不。这种扩展发生在句法引号已经被处理之后;因此,在扩展时添加语法引号是没有意义的。 确实 发生的是数组按字面意思扩展;如果您使用set -x,它会添加引号或扩展名来显示该事实,但实际上并没有在幕后添加引号。

标签: arrays bash shell unix


【解决方案1】:

您的预期输出的最后一个示例是

的确切输出
$ arr=( foo "quz bar" "wibble 'smoo' \"blep\"")
$ printf "%q " "${arr[@]}"
foo quz\ bar wibble\ \'smoo\'\ \"blep\"

printf 中的 %q 占位符以带引号的形式输出其字符串,准备用作输入。

【讨论】:

  • 这个答案对我来说是一个启示。它允许将引用的命令行作为参数传递给例如 $TERMINAL -e(在此处使用:github.com/edrex/dotfiles/commit/…)谢谢!
猜你喜欢
  • 2016-11-22
  • 2011-05-02
  • 2021-11-20
  • 2018-09-10
  • 1970-01-01
  • 1970-01-01
  • 2012-10-10
  • 2017-07-11
  • 1970-01-01
相关资源
最近更新 更多