如何在Bash中用包含多行内容的字符串填充数组?
处理带多行内容的字符串变量转数组问题
问题场景
我有一个包含多个字符串的变量,其中部分字符串带有多行内容:
var="foo 'bar baz' 'lorem ipsum'"
需要把这些带引号或不带引号的字符串,分别作为数组的独立元素。
最初尝试与报错
原本打算用xargs -n1拆分字符串并导入数组:
mapfile -t arr < <(xargs -n1 <<< "$(echo "$var")" )
但执行时触发如下错误:
xargs: unmatched single quote; by default quotes are special to xargs unless you use the -0 option
临时解决方法
我想到将换行符替换为回车符,处理完成后再恢复换行的办法,这个方法能正常工作:
# 填充数组(临时保留换行符的折中方案) mapfile -t arr < <(xargs -n1 <<< "$(echo "$var" | tr '\n' '\r')" ) # 恢复原字符串中的换行符 for (( i=0; i<${#arr[@]}; i++ )); do arr[i]=$(echo "${arr[$i]}" | tr '\r' '\n') done
执行验证输出:
# for (( i=0; i<${#arr[@]}; i++ )); do echo "index: $i, value: ${arr[$i]}"; done index: 0, value: foo index: 1, value: bar baz index: 2, value: lorem ipsum
但这个方法有明显局限性:仅当输入变量本身不包含回车符时有效。
疑问与优化需求
我希望让xargs以空字节分隔输出结果,再配合mapfile的-d ''选项来导入数组,但xargs似乎没有类似print0的输出选项(直接用tr '\n' '\0'会直接修改多行字符串本身的换行符,破坏原内容),该如何实现更可靠的拆分?
内容的提问来源于stack exchange,提问作者mgutt
相关产品推荐
相关产品推荐

