![bash:将数组转换为保留空格的字符串](https://linux22.com/image/143215/bash%EF%BC%9A%E5%B0%86%E6%95%B0%E7%BB%84%E8%BD%AC%E6%8D%A2%E4%B8%BA%E4%BF%9D%E7%95%99%E7%A9%BA%E6%A0%BC%E7%9A%84%E5%AD%97%E7%AC%A6%E4%B8%B2.png)
答案1
尽管我不太明白将字符串作为单独的字符读入数组的用处,只是为了再次重新形成字符串,但设置IFS
为单个空格将在使用 时在数组的元素之间插入单个空格"${arr[*]}"
。相反,设置IFS
为空字符串:
readarray -t arr < <( grep -o . <<<"$1" )
( IFS=''; printf '%s\n' "${arr[*]}" )
我使用子 shell 来分配 asIFS
和 as ,以不更改脚本其余部分printf
的值。IFS
答案2
*
a in的使用"${arr[*]}"
是介绍第一个字符来自 IFS 作为数组每个元素的分隔符。您可以尝试更改 IFS:
readarray -t arr < <(grep -o . <<< "$input")
( IFS=''; echo "${arr[*]}" )
或者尝试使用 eval 进行复杂的求值延迟:
readarray -t arr < <(grep -o . <<< "$input")
IFS='' eval 'echo "array= ${arr[*]}"'
但是,当您只需要一个简单的 printf 时,并不真正需要启动子 shell(以避免更改当前 shell 中的 IFS)或增加 eval 的风险:
readarray -t arr < <(grep -o . <<< "$input")
printf '%s' "${arr[@]}" $'\n'
请注意,使用 grep 将从中删除任何内部换行符$input
。
为了能够获取数组元素中的换行符(对于小输入):
[[ $input =~ ${input//?/(.)} ]] && arr=("${BASH_REMATCH[@]:1}")
printf '%s' array= "${arr[@]}" $'\n'