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[*]}" )

IFS私はスクリプトの残りの部分で値を変更しないようにサブシェルを使用してasとasを割り当てましたprintfIFS

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

関連情報