答え1
文字列を再構築するために文字列を個々の文字として配列に読み込む方法はよくわかりませんが、単一のスペースに設定すると、配列要素間IFS
に単一のスペースが挿入されます"${arr[*]}"
。代わりにIFS
空の文字列に設定してください。
readarray -t arr < <( grep -o . <<<"$1" )
( IFS=''; printf '%s\n' "${arr[*]}" )
IFS
私はスクリプトの残りの部分で値を変更しないようにサブシェルを使用してasとasを割り当てましたprintf
。IFS
答え2
*
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だけが必要な場合は、サブシェルを起動したり(現在のシェルでIFSの変更を避けるため)、評価リスクを高める必要はありません。
readarray -t arr < <(grep -o . <<< "$input")
printf '%s' "${arr[@]}" $'\n'
grepは内部改行文字をすべて削除することに注意してください$input
。
配列要素から改行文字を取得するには(小さい入力の場合):
[[ $input =~ ${input//?/(.)} ]] && arr=("${BASH_REMATCH[@]:1}")
printf '%s' array= "${arr[@]}" $'\n'