![如何使用 IFS 和 read 或任何其他方法将长字符串分成字符串数组](https://linux22.com/image/211288/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20IFS%20%E5%92%8C%20read%20%E6%88%96%E4%BB%BB%E4%BD%95%E5%85%B6%E4%BB%96%E6%96%B9%E6%B3%95%E5%B0%86%E9%95%BF%E5%AD%97%E7%AC%A6%E4%B8%B2%E5%88%86%E6%88%90%E5%AD%97%E7%AC%A6%E4%B8%B2%E6%95%B0%E7%BB%84.png)
我有一长行是 git 命令的输出:a=$(git submodule foreach git status)
。它看起来像这样:a =“输入'目录1/子目录' 在分支 master 上您的分支已更新为“origin/master”。没有什么可提交的,工作树干净输入'目录2' HEAD 在 xxxxxx 处分离,无需提交任何内容,工作树干净输入'目录3' 在分支 master 上您的分支已更新为“origin/master”。没有什么可提交的,工作树干净输入'目录4' 在分支 master 上您的分支已更新为“origin/master”。没有什么可承诺的,工作树干净”
我想将它分成一个数组:
ARR[0] = "'目录1/子目录’关于分部主...”
ARR[1] = "'目录2’头脱离了……”
ETC。
为此,我尝试用“Entering”代替符号(我尝试过 # $ % & \t ...),并且a=${a//Entering /$}
它工作正常。然后,我尝试使用 IFS 并读取将其分成数组:IFS='$' read -ra ARR <<< "$a"
这就是我面临问题的地方。
我得到的输出echo ${ARR[@]}
是“Dir1/Subdir1”,所以我认为读取受到空格或 git 输出方式的影响,但我不明白发生了什么以及如何修复它。您能给我一些建议吗?
谢谢。
答案1
您可以使用readarray
bash 内置命令并在同一命令中指定分隔符:
readarray -d 'char delimiter' array <<< $variable
例如:
readarray -d '@' array <<< ${a//Entering /@}
最后,当您打印每个结果时,您可能需要删除@
(或用作分隔符的任何其他字符):
echo ${array[1]%@}
echo ${array[2]%@}
echo ${array[@]%@}
如果您想删除索引0
(因为它包含@
),您可以通过将项目从索引复制到最后一个索引来重新分配数组1
:
array=("${array[@]:1}")
提示:如果您想避免${array[index]%@}
每次想要获取某些项目时都使用该数组,可以通过删除@
with 来重新分配数组:
array=("${array[@]/@}")