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将保持换行符附加到数组元素. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |