如何在 POSIX shell 脚本中使用伪数组?
我想用类似于 POSIX shell 脚本的东西替换 Bash 脚本中的 10 个整数数组。
在使用数组部分,我设法遇到了Rich 的 sh (POSIX shell) 技巧。
我尝试了什么:
save_pseudo_array()
{
for i do
printf %s\\n "$i" | sed "s/'/'\\\\''/g;1s/^/'/;\$s/\$/' \\\\/"
done
echo " "
}
coords=$(save_pseudo_array "$@")
set -- 1895 955 1104 691 1131 660 1145 570 1199 381
eval "set -- $coords"
我不理解它,这就是问题所在,如果有人可以对此有所了解,非常感谢。
基本思想是用于
set
重新创建使用数组中的索引值的体验。因此,当您想使用数组时,您可以set
使用值运行;那是然后您可以使用
$1
,$2
等for
来处理给定的值。如果您需要多个数组,那么所有这些都没有多大用处。这就是
save
andeval
技巧的用武之地:Rich 的save
函数¹ 处理当前的位置参数并输出一个带有适当引用的字符串,然后可以使用它eval
来恢复存储的值。这样你跑将当前工作数组保存到
coords
中,然后创建一个新数组,使用它,当您需要coords
再次使用它时,您eval
可以:要理解该示例,您必须考虑您在这里使用两个数组,一个具有先前设置的值,并且您存储在 中
coords
,另一个包含 1895、955 等的数组。片段本身并没有那么多就其本身而言,您将在set
和eval
行之间进行一些处理。如果您需要稍后返回 1895、955 数组,则在恢复之前先保存coords
:这样你
$newarray
以后可以恢复。¹ 定义为
这个想法是将任意字符串的列表编码为标量变量,其格式可以稍后用于重建列表或任意字符串。
当你坚持
set --
这一点时,它会生成 shell 代码来重建该列表x
,y z
字符串并将其存储在$@
数组中,你只需要eval
uate。sed
负责正确引用每个字符串(在第一行的开头添加,'
在最后一行的末尾添加,并将所有'
s替换为'\''
)。但是,这意味着为每个参数运行一个
printf
和sed
命令,因此效率很低。这可以通过一次 awk 调用以更直接的方式完成: