bash:将数组转换为保留空格的字符串

bash:将数组转换为保留空格的字符串

我只是想将数组转换为字符串,同时保留空格。这就是我所拥有的:

INPUT=$1
readarray -t arr < <(grep -o . <<< "$INPUT")

echo "${arr[*]}"

我尝试使用${parameter//pat/string},将 IFS 设置为IFS=' ',但显然是错误的。我无法产生所需的输出。

printf %q "$IFS"输出$' \t\n'

我用命令运行我的脚本./rev_arr "I'm Hungry!"

输出:

预期输出:在此输入图像描述

答案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'

相关内容