Arrays 从bash输出bash引用的数组

Arrays 从bash输出bash引用的数组,arrays,bash,shell,unix,Arrays,Bash,Shell,Unix,在bash中(可能使用通常安装在Unix系统上的命令),我希望将数组中的所有元素输出到终端,以便数组中的每个元素都是正确引用的bash字符串 例如,假设数组包含三个元素(我将在这里列出它们,每行一个数组元素,以避免我们混淆引号是否是字符串的一部分): 理想情况下,我希望输出: foo "qux bar" "wibble 'smoo' \"blep\"" 但是,如果它使实现变得相当简单,我也可以接受: "foo" "qux bar" "wibble 'smoo' \"blep\"" 甚至这个:

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

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

理想情况下,我希望输出:

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为我执行此操作。

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

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

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

我不知道有任何类似的内置机制。当它向程序传递参数时(这是
“$@”
所做的),它有一种方法可以做到这一点,但不用于向用户演示。
[Q]uoting“$@”会导致数组在每个项周围用引号展开[…]
——不完全是这样。这种展开发生在已经处理了语法引号之后;因此,在扩展时添加语法引号是没有意义的。实际情况是,数组按字面展开;如果您使用
set-x
,它会添加引号或扩展以显示该事实,但实际上并不是在引擎盖下添加引号。这个答案对我来说是一个启示。它允许将带引号的命令行作为参数传递给eg$TERMINAL-e(此处使用:)谢谢!
$ arr=( foo "quz bar" "wibble 'smoo' \"blep\"")
$ printf "%q " "${arr[@]}"
foo quz\ bar wibble\ \'smoo\'\ \"blep\"