You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在POSIX Shell脚本中使用伪数组?替换Bash数组需求解析

拆解POSIX Shell模拟数组的这段代码

咱们来一步步扒明白这段用来在POSIX Shell里模拟数组的代码——毕竟POSIX Shell本身没有真正的数组类型,只能靠位置参数($@这类)来模拟,这段代码就是用来保存和恢复这些“伪数组”的。

先看核心函数:save_pseudo_array()

save_pseudo_array() { for i do printf %s\n "$i" | sed "s/'/'\\''/g;1s/^/'/;\$s/\$/' \\/" done echo " " }

这个函数的作用是把传入的所有参数(也就是你要保存的“数组元素”)转换成一个可以安全用eval恢复的字符串,拆解每一部分:

  • for i do:遍历函数收到的每一个参数(POSIX Shell里for不写in的话,默认遍历$@,也就是所有传入的参数)
  • printf %s\n "$i":把每个参数单独打一行,确保sed能逐行处理
  • 管道给sed的三个替换命令:
    1. s/'/'\\''/g:转义参数里的单引号——把每个'换成'\'',这样后续用eval的时候,参数里的单引号不会破坏命令的语法结构
    2. 1s/^/'/:给处理的第一行开头加一个单引号,用来把整个参数列表的开头包裹起来
    3. \$s/\$/' \\/:给每一行的末尾加一个单引号和反斜杠,反斜杠是用来续行的,确保整个字符串是一个连续的、被单引号包裹的参数序列
  • echo " ":最后补个空格,避免eval执行时出现语法错误

接下来的命令解析

coords=$(save_pseudo_array "$@")

调用上面的函数,把当前Shell的位置参数(也就是$@,你之前通过set --设置的或者脚本收到的参数)转换成格式化后的字符串,存到coords变量里。这一步就是把“伪数组”序列化保存起来。

set -- 1895 955 1104 691 1131 660 1145 570 1199 381

这是POSIX Shell里设置位置参数的标准写法:把$1到$10分别设成这10个整数,相当于把位置参数当作数组来用——$1就是第一个元素,$2是第二个,以此类推。

eval "set -- $coords"

把之前存在coords里的格式化字符串当作命令执行,本质是把位置参数恢复成save_pseudo_array保存之前的状态。这里eval是关键,它会解析coords里的字符串,把那些被单引号包裹的内容当作完整的参数,重新设置到位置参数里,这样就完美恢复了之前的“伪数组”,连带空格的参数都不会被拆分。

为什么要这么折腾?

因为POSIX Shell没有原生数组,大家只能用位置参数来模拟数组的功能,但位置参数会被后续的set --覆盖,所以这段代码就是用来临时保存当前的位置参数,之后再恢复回来——比如你需要临时用位置参数做别的事,做完再换回原来的参数列表。

内容的提问来源于stack exchange,提问作者Vlastimil Burián

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 03:16:52