【发布时间】:2021-07-05 13:36:13
【问题描述】:
在自学 Bash 编程时,我遇到了一个有趣的用例,我想获取环境中存在的变量列表,并将它们放入数组中。然后,我想输出一个变量名称及其值的列表,并将该输出存储在一个数组中,每个变量一个条目。
我只用了大约 2 周的时间以任何“真实”的方式编写 Bash shell 脚本,而且我正在对自己进行数组方面的教育。其他编程语言中的一个常见功能是能够“压缩”两个数组,例如as is done in Python。任何编程语言的另一个共同特征是间接性,例如通过pointer indirection 等。这在很大程度上是学术性的,通过一个有点挑战性的例子来教我自己,但我认为如果除了调试、跟踪整体系统状态等原因之外,这具有广泛的用途。
我想要的是以下输入...:
VAR_ONE="LIGHT RED"
VAR_TWO="DARK GREEN"
VAR_THREE="BLUE"
VARIABLE_ARRAY=(VAR_ONE VAR_TWO VAR_THREE)
...要转换成以下输出(作为一个数组,每行一个元素):
VAR_ONE: LIGHT RED
VAR_TWO: DARK GREEN
VAR_THREE: BLUE
约束:
- 假设我无法控制所有变量,所以我不能回避问题,例如从一开始就使用关联数组。 (即,请不要建议通过从不使用名为“VAR_ONE”的离散变量来完全避免间接引用查找的需要)。但是将结果存储在关联数组中的解决方案很好。
- 假设变量名永远不会包含空格,但它们的值可能。
- 最终输出应该不包含单独的元素,因为输入变量的值包含空格。
到目前为止我所读到的内容:
- 我读过一些 StackOverflow 的帖子,比如这篇文章,这些帖子处理使用对数组的间接引用它们自己(例如,如果您有三个数组并希望根据“数组选择”变量):How to iterate over an array using indirect reference?
- 我还发现了一篇文章,它以我所说的方式处理 Bash 中的“压缩”数组,您可以在其中配对,例如
array1和array2中的第一个元素,然后将第二个元素配对,等等:Iterate over two arrays simultaneously in bash - ...但我还没有找到任何可以充分讨论这个独特用例的内容...
问题:
如果给定一个仅包含变量名称列表的数组,我应该如何创建一个包含变量名称列表及其值(以冒号分隔)的数组。我并不是“没有想出任何方法来做到这一点”,但我想在 Bash 中找到“首选”的方法来做到这一点,考虑到性能、安全性和简洁/易于理解。
编辑:我将发布到目前为止我想出的答案作为这篇文章的答案......但不要将其标记为已回答,因为我还想听到一些公正的建议......
【问题讨论】:
-
如果您不介意使用变量名作为数组索引,请考虑使用关联数组 (
declare -A arrayname);至于你的其他问题......我建议你专注于你遇到的一个问题,然后要么a)更新问题,专注于那个问题,要么b)关闭/删除这个问题并提出一个新的更有针对性的问题;这个问题可能会被标记为关闭,因为a)没有关注一个特定的问题,b)你似乎在征求意见 -
我不明白你为什么要排除关联数组,因为你没有“控制所有变量”——这不重要吗?我同意 @markp-fuso 的观点,这似乎是同时出现的许多问题。
-
我承认我在中途停止阅读这个问题(没有重点,漫无边际)所以错过了 OP 关于关联数组的评论;由于值中的空格,关于使用关联数组的消息(?)没有意义......关联数组索引和值可能包含空格......?如果不知道所有名称,则不确定 OP 计划如何“压缩”变量列表... ??
-
@markp-fuso :编辑问题以将我自己的想法作为答案而不是在主帖中。关于一个问题,它是:创建一个包含变量名称列表及其值(冒号分隔)的数组,给定一个仅包含变量名称列表的数组。我承认我并不是“没有想出任何方法来做到这一点”,但我想在 Bash 中找到“首选”的方法来做到这一点,考虑到性能、安全性和简洁/易于理解。我会在原帖中注明。
-
@BenjaminW。如果您有使用关联数组的想法,请分享。我的意思是,我读过一些帖子说“从一开始就将名称/值对(例如 [VAR_1] = LIGHT RED)存储在关联数组中,避免让自己完全需要使用间接引用” ”。假设我正在使用预定义的系统环境变量。但是,如果您有办法从这些变量中收集值并将它们放入一个关联数组,那将是一个很好的解决方案。不过,这会使最后的“打印输出”步骤更加冗长吗?
标签: arrays bash pointers eval indirection