加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

arrays – 将多行字符串读入数组时出错?

发布时间:2020-12-15 22:02:13 所属栏目:安全 来源:网络整理
导读:我使用以下bash代码想要将多行字符串读入数组.我希望每个数组元素对应一个字符串的一行. mytext="line oneline twoline three"IFS=$'n' read -a lines "${mytext}"echo "len=${#lines[@]}"for line in "${lines[@]}"do echo "[$line]"done 我希望“len”应
我使用以下bash代码想要将多行字符串读入数组.我希望每个数组元素对应一个字符串的一行.

mytext="line one
line two
line three"
IFS=$'n' read -a lines <<<"${mytext}"
echo "len=${#lines[@]}"
for line in "${lines[@]}"
do
   echo "[$line]"
done

我希望“len”应该等于3,并且“lines”数组应该正确初始化.但是,我得到了以下结果:

len=1
[line one]

我使用了错误的“IFS”吗? bash代码中有哪些错误?
提前致谢.

解决方法

你的解决方案有什么问题,读取总是一次读取一行,所以告诉它IFS是换行符会让它读取整行到数组的第一个元素.每次阅读时你仍然会覆盖整个阵列.您可以迭代地构建数组:

lines=()
while read; do
  lines+=("$REPLY")
done <<< "$mytext"

或者通过换换其他内容换行:

IFS='+' read -a lines <<< "${mytext//$'n'/+}"
$IFS=@
$echo "${lines[*]}"
line one@line two@line three

使用mapfile(a.k.a.readarray)将是一个更连贯,更优雅的解决方案,但这仅在Bash 4中得到支持:

mapfile -t lines <<< "$mytext"

$printf '[%s]n' "${lines[@]}"
[line one]
[line two]
[line three]

如果没有-t标志,mapfile将保持换行符附加到数组元素.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读