最新版本基于BinaryZebra 的评论
并在此处测试。添加command eval
允许将表达式保留在当前执行环境中,而之前的表达式仅在 eval 期间保留。
使用没有空格\制表符的 $IFS,只有换行符/CR
$ IFS=$'\r\n' GLOBIGNORE='*' command eval 'XYZ=($(cat /etc/passwd))'
$ echo "${XYZ[5]}"
sync:x:5:0:sync:/sbin:/bin/sync
另请注意,您可能将数组设置得很好,但读错了 - 请务必使用双引号""
和大括号{}
,如上例所示
编辑:
请注意关于可能的全局扩展的评论中关于我的回答的许多警告,特别是gniourf-gniourf对我之前尝试解决的评论
考虑到所有这些警告,我仍然将这个答案留在这里(是的,bash 4 已经存在很多年了,但我记得一些只有 2/3 年历史的 Mac 将 pre-4 作为默认 shell)
其他注意事项:
也可以按照下面 drizzt 的建议,将分叉的 subshell+cat 替换为
$(</etc/passwd)
我有时使用的另一个选项是将 IFS 设置为 XIFS,然后再恢复。另请参阅Sorpigal 的答案,不需要为此烦恼