長い文字列値を持つ変数を含むbashスクリプトを作成しようとしています。文字列を複数行に分割するとエラーが発生します。文字列を複数行に分割して変数に代入するには?
答え1
配列の複数の部分文字列に長い文字列を割り当てると、コードがより美しくなります。
#!/bin/bash
text=(
'Contrary to popular'
'belief, Lorem Ipsum'
'is not simply'
'random text. It has'
'roots in a piece'
'of classical Latin'
'literature from 45'
'BC, making it over'
'2000 years old.'
)
# output one line per string in the array:
printf '%s\n' "${text[@]}"
# output all strings on a single line, delimited by space (first
# character of $IFS), and let "fmt" format it to 45 characters per line
printf '%s\n' "${text[*]}" | fmt -w 45
逆にします。つまり、長い行を複数行に分割し、配列変数として読み込みます。
$ cat file
Contrary to popular belief, Lorem Ipsum is not simply random text. It has roots in a piece of classical Latin literature from 45 BC, making it over 2000 years old.
fmt
ここでは、行を最大30文字の短い行に分割し、シェルからこの行を次の名前の配列として読み込みreadarray
ます。bash
text
$ readarray -t text < <(fmt -w 30 file)
これで、行グループまたは各個々の行にアクセスできます。
$ printf '%s\n' "${text[@]}"
Contrary to popular belief,
Lorem Ipsum is not simply
random text. It has roots in a
piece of classical Latin
literature from 45 BC, making
it over 2000 years old.
$ printf '%s\n' "${text[3]}"
piece of classical Latin
(配列は0から始まりますbash
。)
答え2
おすすめ:
x='Lorem ipsum dolor sit amet, consectetur '\
'adipiscing elit, sed do eiusmod tempor '\
'incididunt ut labore et dolore magna aliqua.'
結果は次のとおりです。
$ printf '%s\n' "$x"
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
答え3
要点は、非常に長い行をシェル変数に格納することですが、Bourneなどのシェルを想定し、コードが特定の固定幅内でそうするようにする場合は、次のことができます。
string="Rerum inventore nemo neque reiciendis ullam. Volupta\
te amet eveniet corporis nostrum. Laboriosam id sapiente atq\
ue non excepturi. Dolorem alias sed et voluptatem est unde s\
ed atque. Itaque ut molestias alias dolor eos doloremque exp\
licabo. Quas dolorum sint sit dicta nemo qui."
一重引用符とは異なり、二重引用符内では、バックスラッシュの改行はまだ行の連続と見なされます。二重引用符内の、、、"
は(時々)まだ特別なので、エスケープする必要があります。$
`
\
!
参照の心配を避ける方法は、次のように書くことです。
string=$(<<'EOF' tr -d '\n'
Rerum inventore nemo neque reiciendis ullam. Vo
luptate amet eveniet corporis nostrum. Laborios
am id sapiente atque non excepturi. Dolorem ali
as sed et voluptatem est unde sed atque. Itaque
ut molestias alias dolor eos doloremque explic
abo. Quas dolorum sint sit dicta nemo qui. 'And
'#\`"$% whatever.
EOF
)
区切り文字を引用すると、<<
部分的にもここの文書本文では拡張は行われません。ここでは、出力をキャプチャtr
して here ドキュメントに供給し、ドキュメントから ewline 文字をd
削除します。n
インデントを追加するには、次のものを使用できます。
string=$(<<'EOF' cut -b3- | tr -d '\n'
Rerum inventore nemo neque reiciendis ullam. Vo
luptate amet eveniet corporis nostrum. Laborios
am id sapiente atque non excepturi. Dolorem ali
as sed et voluptatem est unde sed atque. Itaque
ut molestias alias dolor eos doloremque explic
abo. Quas dolorum sint sit dicta nemo qui. 'And
'#\`"$% whatever.
EOF
)
答え4
私はこれをコマンドラインプロンプトに書き込みます。もちろん、さらに圧縮することもできますが、明確にするために次のようにします。
~$ text='You can do this, but the newlines will be embedded in the variable, so it won’t be a single line'
~$ array=$(echo $text | cut -d' ' -f 1-)
~$ for x in ${array[@]}; do echo $x ; done
これは一行です。
~$ echo $text | tr ' ' '\n'
出力:
You
can
do
this,
but
the
newlines
will
be
embedded
in
the
variable,
so
it
won’t
be
a
single
line
またはソートされた出力の場合:
~$ echo $text | tr ' ' '\n' | sort
出力:
a
be
be
but
can
do
embedded
in
it
line
newlines
single
so
the
the
this,
variable,
will
won’t
You