arrays - 从 bash 输出 bash 引用数组

标签 arrays bash shell unix

在 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/

相关文章:

linux - 如何检查条件,然后使用 awk 在条件行之前的行中打印特定字段?

C++ 数组输入和退出验证

c - 查找结构数组中的记录数

bash - 如何对 bash 中的文件列表执行多个命令(xargs?)

bash - 将 xml 解析为并替换特定标签 shell 脚本

linux - 过去 X 小时的 Grep

c++ - Makefile 改头换面——几乎完成,希望得到反馈

javascript - 如何在 JavaScript Uint8Array 中存储字符代码?

c# - MySQL 和 C# 从数据库获取数据并创建关联数组/对象

bash - ECS Docker 容器获取运行 cron 的环境变量