gpt4 book ai didi

arrays - Bash:将行读入数组*而不*触及 IFS

转载 作者:行者123 更新时间:2023-11-29 09:16:01 27 4
gpt4 key购买 nike

我正在尝试将子 shell 的输出行读取到数组中,但我不愿意设置 IFS,因为它是全局的。我不希望脚本的一部分影响后面的部分,因为那是不好的做法,我拒绝这样做。在命令后恢复 IFS 不是一个选项,因为在编辑脚本后将恢复保持在正确的位置太麻烦了。我如何向 bash 解释我希望每个数组元素包含整行,而不必设置任何会破坏 future 命令的全局变量?

这是一个显示 IFS 不需要的粘性的示例:

lines=($(egrep "^-o"  speccmds.cmd))
echo "${#lines[@]} lines without IFS"

IFS=$'\r\n' lines=($(egrep "^-o" speccmds.cmd))
echo "${#lines[@]} lines with IFS"

lines=($(egrep "^-o" speccmds.cmd))
echo "${#lines[@]} lines without IFS?"

输出是:

42 lines without IFS
6 lines with IFS
6 lines without IFS?

最佳答案

这个问题可能是基于一个误解。

IFS=foo read 不会在读取操作本身之外更改 IFS。

因此,这会产生副作用,应该避免:

IFS=
declare -a array
while read -r; do
array+=( "$REPLY" )
done < <(your-subshell-here)

...但这完全没有副作用:

declare -a array
while IFS= read -r; do
array+=( "$REPLY" )
done < <(your-subshell-here)

对于 bash 4.0 或更新版本,还有 readarraymapfile 选项(相同操作的同义词):

mapfile -t array < <(your-subshell-here)

在稍后添加到您的答案的示例中,您的代码如下:

lines=($(egrep "^-o"  speccmds.cmd))

更好的写法是:

mapfile -t lines < <(egrep "^-o"  speccmds.cmd)

关于arrays - Bash:将行读入数组*而不*触及 IFS,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22518478/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com