web-dev-qa-db-ja.com

Linuxのbashスクリプトで変数に割り当てられた複数の行に長い文字列を分割する方法

私は長い文字列値を持つ変数を含むbashスクリプトを書くことに取り組んでいます。文字列を複数の行に分割すると、エラーが発生します。文字列を複数の行に分割して変数に割り当てる方法は?

配列内の複数の部分文字列として長い文字列を割り当てると、コードが美的に魅力的になります。

#!/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
2
Kusalananda

1つの提案:

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.
0
Jeff Schaller

文字列some long piece of text to assignを変数strに割り当てるとします。これは動作しません:

str='some long'
'piece of text'
'to assign'

最初の行をコマンドとして実行しようとしますが、おそらく「コマンドが見つかりません」というエラーが表示されます。

これは可能ですが、改行は変数に埋め込まれるため、1行にはなりません。

str='some long
piece of text
to assign'

ただし、部分文字列置換展開(Bash、ksh、zsh)を使用して、それらをスペースに置き換えることができます。 str="${str//$'\n'/ }"置換を行い、新しい値を同じ変数に保存します。最後の行を除くすべての末尾の空白は文字列に残ることに注意してください。

もう1つのオプションは、+=を使用して変数の値に追加することです(Bash、ksh、zshのみ)。

str='some long'
str+=' piece of text'
str+=' to assign'

ここでは、引用符内に空白を手動で入力する必要があります。

または、標準のシェルで同様に:

str='some long'
str="$str"' piece of text'
str="$str"' to assign'

次に、行を継続する方法があります(ジェフはすでに その答え で言及しています):

str='some long'\
' piece of text'\
' to assign'

ここでも、末尾の空白が重要です。行の継続は、バックスラッシュの直後に改行が続く場合にのみ機能し、間にスペースがある場合は機能しません。

0
ilkkachu