在 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 为我做这件事。
最佳答案
你最后一个预期输出的例子是
$ arr=( foo "quz bar" "wibble 'smoo' \"blep\"")
$ printf "%q " "${arr[@]}"
foo quz\ bar wibble\ \'smoo\'\ \"blep\"
printf
中的 %q
占位符以引号形式输出其字符串,准备用作输入。
关于arrays - 从 bash 输出 bash 引用数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23699740/